我想模拟一个作为函数的主参数传入的接口,但该方法很复杂,因此我不想为每个测试指定默认值或确切行为。我想在Setup方法中指定默认值,并根据需要覆盖每个测试中的特定部分。
即:
public interface IOptions
{
string Something { get; }
}
[TestFixture]
public class Tester
{
MockRepository mocks;
IOptions someOptions;
string expectedXml;
[Setup]
public void Setup()
{
mocks = new MockRepository();
someOptions = mocks.DynamicMock<IOptions>();
//Something that would go here.
// I.e. SetupResult.For(someOptions.Something).Return("default");
}
[Teardown]
public void Teardown()
{
mocks.ReplayAll();
using (var ms = new MemoryStream())
{
var unitUnderTest = new SomeOptionsWriter(ms);
unitUnderTest.Write(someOptions);
Assert.AreEqual(expectedXml, Encoding.Utf8.GetString(ms.ToArray()));
}
mocks.VerifyAll();
}
[Test]
public void SomeTest()
{
expectedXml = "<root><default></default></root>";
//Relies on default behavior
}
[Test]
public void SomeTest2()
{
expectedXml = "<root><sub></sub></root>";
Expect.Call(someOptions.Something).Return("sub");
}
}
如何使用Rhino Mocks实现这一目标?
答案 0 :(得分:1)
为了完全回答你的问题,我必须跳过@Patrick Steele的回答。使用AAA设置。在SetUp方法中声明默认存根,然后在特定测试方法中覆盖这些存根。除非重新实例化对象,否则您将无法删除现有存根。
为给定函数添加的最后一个存根将覆盖前一个。
someOptions.Stub(o => o.Something).Return("default");
someOptions.Stub(o => o.Something).Return("override");
示例中的上述存根将在调用时返回“覆盖”。
答案 1 :(得分:0)
不要使用记录/重播语义。使用AAA(安排/动作/断言)。在每个测试中,您可以使用两行代码来存根IOptions
:
IOptions someOptions = MockRepository.GenerateStub<IOptions>();
someOptions.Stub(o => o.Something).Return("default");
答案 2 :(得分:0)
您可以清除this other answer中演示的存根或模拟的行为。请注意,这将清除所有方法的行为,而不仅仅是一个。