【问题标题】:moq SetupSequence with queue only executing first time起订量 SetupSequence 队列仅第一次执行
【发布时间】:2022-11-04 16:22:39
【问题描述】:

我正在尝试使用基于队列返回值的循环动态地进行模拟。使用的代码如下(从stackoverflow上的另一个答案中获得)。

var numberQueue = new Queue<int>(new[] { 4, 8, 16, 43});
var mock = new Mock<ITest>();
mock.SetupSequence(x => x.GetNumber()).Returns(numberQueue.Dequeue);

int x1 = mock.Object.GetNumber(); // expected: 4 actual: 4 
int x2 = mock.Object.GetNumber(); // expected: 8 actual: 0
int x3 = mock.Object.GetNumber(); // expected: 16 actual: 0
int x4 = mock.Object.GetNumber(); // expected: 32 actual: 0

x1.Should().Be(4); // passes
x2.Should().Be(8); // fails
x3.Should().Be(16); // fails
x4.Should().Be(32); //fails

第一个工作正常,但之后一切都为 0。我试图让它以这种方式运行,因为我希望能够为 IDataReader 动态设置一个模拟。

【问题讨论】:

    标签: c# unit-testing queue moq


    【解决方案1】:

    有多种方法可以解决您的问题,让我向您展示两种最基本的方法。

    选项1

    使用Setup 而不是SetupSequence

    mock.Setup(x => x.GetNumber()).Returns(numberQueue.Dequeue);
    

    在此更改之后,您的测试将在 x4.Should().Be(32) 行失败,因为 x4 是 43。

    选项 #2

    SetupSequence 与多个Returns 调用一起使用

    mock.SetupSequence(x => x.GetNumber())
        .Returns(numberQueue.Dequeue)
        .Returns(numberQueue.Dequeue)
        .Returns(numberQueue.Dequeue)
        .Returns(numberQueue.Dequeue);
    

    【讨论】:

      猜你喜欢
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      相关资源
      最近更新 更多