是否可以在 Moq 中定义严格的行为?
我想调用ReadLine
两次,但为两次不同的调用定义不同的返回值。请参阅下面的代码示例:
最小起订量示例(失败)
[Test]
public void ExampleDifferentResultOnReadLine()
{
var textReader = new Mock<TextReader>(MockBehavior.Strict);
textReader.Setup(reader => reader.ReadLine()).Returns("Bla");
textReader.Setup(reader => reader.ReadLine()).Returns("Bla1");
var str = textReader.Object.ReadLine();
var str1 = textReader.Object.ReadLine();
Assert.AreEqual("Bla", str); // Fails: mocks returns Bla1
Assert.AreEqual("Bla1", str1);
}
Rhino 模拟示例(成功)
public void ExampleDifferentResultOnReadLine()
{
var textReader = MockRepository.GenerateStrictMock<TextReader>();
// var textReader = new Mock<TextReader>(MockBehavior.Strict);
textReader.Expect(reader => reader.ReadLine()).Return("Bla");
textReader.Expect(reader => reader.ReadLine()).Return("Bla1");
var str = textReader.ReadLine();
var str1 = textReader.ReadLine();
Assert.AreEqual("Bla", str);
Assert.AreEqual("Bla1", str1);
}
最小起订量也可以吗?
最佳答案
模拟构造函数接受MockBehavior
枚举值:
var textReader = new Mock<TextReader>(MockBehavior.Strict);
顺便说一句,测试调用顺序的正确代码将是(因为 RhinoMocks 添加了期望,而 Moq 仅使用您提供的最后一个值):
var textReader = new Mock<TextReader>();
textReader.SetupSequence(r => r.ReadLine())
.Returns("Bla")
.Returns("Bla1");
var str = textReader.Object.ReadLine();
var str1 = textReader.Object.ReadLine();
Assert.AreEqual("Bla", str);
Assert.AreEqual("Bla1", str1);
关于c# - Moq 定义严格的模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21636891/