我有以下单元测试
[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。如果我删除序列,那么它将再次按预期工作。
我做错了什么?某处有完整的工作示例吗?
答案 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属性只能在
上的序列步骤之前读取一次