C# Moq定义严格的模拟
是否可以在Moq中定义严格的行为 我想调用C# Moq定义严格的模拟,c#,unit-testing,moq,C#,Unit Testing,Moq,是否可以在Moq中定义严格的行为 我想调用ReadLine两次,但为两个不同的调用定义不同的返回值。请参见下面的代码示例: 最小起订量示例(失败) [测试] public void示例differentitresultonreadline() { var textReader=newmock(MockBehavior.Strict); text reader.Setup(reader=>reader.ReadLine()).Returns(“Bla”); text reader.Setup(re
ReadLine
两次,但为两个不同的调用定义不同的返回值。请参见下面的代码示例:
最小起订量示例(失败)
[测试]
public void示例differentitresultonreadline()
{
var textReader=newmock(MockBehavior.Strict);
text reader.Setup(reader=>reader.ReadLine()).Returns(“Bla”);
text reader.Setup(reader=>reader.ReadLine()).Returns(“Bla1”);
var str=textReader.Object.ReadLine();
var str1=textReader.Object.ReadLine();
Assert.AreEqual(“Bla”,str);//失败:mocks返回Bla1
断言.AreEqual(“Bla1”,str1);
}
Rhino模拟示例(成功)
public void示例differentitresultonreadline()
{
var textReader=MockRepository.GenerateStrictMock();
//var textReader=newmock(MockBehavior.Strict);
Expect(reader=>reader.ReadLine()).Return(“Bla”);
Expect(reader=>reader.ReadLine()).Return(“Bla1”);
var str=textReader.ReadLine();
var str1=textReader.ReadLine();
断言.等同(“Bla”,str);
断言.AreEqual(“Bla1”,str1);
}
Moq是否也可以这样?Mock构造函数接受
MockBehavior
enum值:
var textReader = new Mock<TextReader>(MockBehavior.Strict);
var textReader=newmock(MockBehavior.Strict);
顺便说一句,测试调用序列的正确代码是(因为Rhinomock增加了期望值,Moq只使用您提供的最后一个值):
var textReader=new Mock();
textReader.SetupSequence(r=>r.ReadLine())
.回报(“Bla”)
.回报(“Bla1”);
var str=textReader.Object.ReadLine();
var str1=textReader.Object.ReadLine();
断言.等同(“Bla”,str);
断言.AreEqual(“Bla1”,str1);
你好,谢尔盖,谢谢。这正是我要找的。您能为Moq分享一个像样的文档链接吗?我所能找到的就是。有没有更详细一点的API/文档是你知道的?@bas我只记得:)但你提供的链接包含了定制模拟行为的示例。顺便说一句,strict mock只是验证对mock的所有调用都已设置。我想你的第二个设置会覆盖第一个值LOL!我更新了问题,同时你也更新了答案。问答仍在同步进行。你太棒了。时期谢谢!
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);
}
var textReader = new Mock<TextReader>(MockBehavior.Strict);
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);