最小起订量:我可以验证 setter 只被调用了 N 次吗?

Moq: Can I verify that a setter was only called N times?

我正在测试具有 public setter 但私有 getter 的 属性。 我知道我可以验证 setter 是否使用给定值调用了两次:

mockTable.VerifySet(m => m.CurrentIndex = 0, Times.Once());
mockTable.VerifySet(m => m.CurrentIndex = 1, Times.Once());

但我似乎无法验证 setter 是否被调用了两次。

这可能吗?

谢谢

您可以使用 Times.Exactly 方法:

mockTable.VerifySet(m => m.CurrentIndex = 0, Times.Exactly(N));

更新 我第一次理解你的观点是错误的,直到你在评论中澄清它。

您可以在测试中编写以下断言:

mockTable.VerifySet(m => m.CurrentIndex = 0, Times.Once);
mockTable.VerifySet(m => m.CurrentIndex = 1, Times.Once);
mockTable.VerifySet(m => m.CurrentIndex = It.IsNotIn(0, 1), Times.Never);

它正是在测试您想要的行为:只有当 CurrentIndex wat 设置正好两次时,测试才会通过:一次为 0,另一次为 1,并且不允许其他 values/times。

我不确定我是否理解正确。如果你不需要知道 CurrentIndex 中使用的值,你可以使用这个:

mockTable.VerifySet(m => m.CurrentIndex = It.IsAny<Int32>(), Times.Exactly(2));

但是如果您确实需要验证 CurrentIndex 中的值,则需要按照您已经在做的方式进行操作,或者 for 如果次数太高。

另一个变体:

mockTable.VerifySet(m => m.CurrentIndex = 0, Times.Once());
mockTable.VerifySet(m => m.CurrentIndex = 1, Times.Once());
mockTable.VerifySet(m => m.CurrentIndex = It.IsAny<int>(), Times.Exactly(2));