使用序列时,Moq不再使用return方法

时间:2014-02-13 09:33:30

标签: moq

我有以下单元测试

[Test]
public void FifoOrderTest()
{
    // Arrange
    var sequence = new MockSequence();
    var mockFoo1 = new Mock<IBar>();
    var mockFoo2 = new Mock<IBar>();
    mockFoo1.InSequence(sequence)
            .Setup(foo => foo.Baz)
            .Returns(100);
    mockFoo2.InSequence(sequence)
            .Setup(foo => foo.Baz)
            .Returns(10000);

    // Act
    sut.AddFoo(mockFoo1.Object);
    sut.AddFoo(mockFoo2.Object);
    sut.RunFoos();

    // Arrange
    mockFoo1.Verify(foo => foo.Something(100));
    mockFoo2.Verify(foo => foo.Something(700));
}

我的问题是Moq没有使用我在mockFoo1和mockFoo2上设置的返回回调。相反,当我的测试系统访问Baz属性时,返回默认值0。如果我删除序列,那么它将再次按预期工作。

我做错了什么?某处有完整的工作示例吗?

2 个答案:

答案 0 :(得分:0)

尝试创建一个方法来为Baz属性设置一个值,例如名为SetProperty()。

然后,尝试使用你的foo.SetProperty而不是属性! ;) 它会起作用!

答案 1 :(得分:0)

你确定你的SUT是正确的吗?

通过以下SUT和IBar,测试似乎按预期工作:

public class Sut
{
    List<IBar> _barList = new List<IBar>();
    public void AddFoo(IBar bar)
    {
        _barList.Add(bar);
    }

    public void RunFoos()
    {
        foreach (var bar in _barList)
        {
            var barProperty = bar.Baz;
            if (barProperty == 100) bar.Something(100);
            if (barProperty == 10000) bar.Something(700);
        }
    }
}

public interface IBar
{
    int Baz { get; }
    void Something(int def);
}

我正在使用Moq 4.2.1402

请注意,每个模拟.Baz属性只能在

上的序列步骤之前读取一次