C# 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

是否可以在Moq中定义严格的行为

我想调用
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);