有时,我在测试类设置中使用存根依赖,然后希望在具体的测试中重新存根其中的一些。但是Rhino mocks只记住第一个存根的值,这有点不方便。
someStub.Stub(x => x.SomeMethod(1)).Return(100);
var value1 = someStub.SomeMethod(1);
someStub.Stub(x => x.SomeMethod(1)).Return(200);
var value2 = someStub.SomeMethod(1);值2将等于100。
这是设计好的行为吗?有什么变通方法吗?
发布于 2014-02-07 04:26:15
我遇到了自己做这件事的需要。我通过使用WhenCalled函数解决了这个问题,在这个函数中,您传入了一个要在调用该函数时执行的操作。这将为您提供更多的灵活性,您可以在不同的点返回什么。
有关此堆栈溢出线程的更多信息/活动:Rhino Mocks: Re-assign a new result for a method on a stub和此处:Changing previously stubbed calls with Rhino Mocks。
我知道这是旧的,但希望它能帮助其他人。
发布于 2010-10-14 17:49:01
你可以通过继承来解决这个问题。如果您有一个基本测试类和一些运行测试的测试子类,则可以将返回值设置为基本测试类的protected属性,并将子类中的值设置在base之前的某个点。调用Initialize。因此(使用MSTEST)您可以拥有:
在您的基类中:
protected int ReturnVal{get; set;}
public void Init()
{
someStub = MockRepository.GenerateMock<ISomeStub>();
someStub.Stub(x => x.SomeMethod(1)).Return(ReturnVal);
}在您的子类中:
[TestInitialize]
public override Init()
{
ReturnVal = 200;
base.Init();
}发布于 2010-10-14 20:32:00
是的,这是设计好的行为。
我大多数时候使用的变通方法是创建一个帮助方法,它将为您设置存根,即:
private X MockX()
{
return MockX(100);
}
private X MockX(int returnValue)
{
var x = MockRepository.GenerateStub<X>();
someStub.Stub(x => x.SomeMethod(1)).Return(returnValue);
return x;
}然后在测试中,不使用在SetUp中创建的模拟,而是调用适当的函数。附加的好处是,很明显,您的测试使用了返回值的一些特殊值。
https://stackoverflow.com/questions/3931842
复制相似问题