c# - Moq 定义严格的模拟

标签 c# unit-testing moq

是否可以在 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/

相关文章:

c# - 使用 Moq 测试接受委托(delegate)的方法

c# - 为什么 C# 在基本构造函数之前设置私有(private)变量,而 VB.NET 却相反?

cocoa - OSX 应用程序的 TDD

java - Android Studio 无法解析导入 org.junit.Before 中的符号 'Before'

unit-testing - Neo4j - 单元测试 REST Api 调用

c# - 设置一个方法来返回作为参数传递的函数的返回值

c# - Autofac 相当于 StructureMap 的 WhatDoIHave()

c# - 枚举列为扩展名?

javascript - 使用 JavaScript 检查一个目标 webgrid 中的所有框

c# - Moq 设置 ServiceLocator