在使用 Moq 模拟被多次调用的依赖项时,我遇到了障碍。当我打电话时Verify
,起订量需要很长时间(几分钟)才能响应,有时会崩溃(我想这是可以理解的,考虑到从“冷启动”开始必须累积NullReferenceException
的数据量)。Moq
Verify
所以我的问题是,我是否可以使用另一种策略来使用 Moq 来做到这一点,或者我应该在这个相当不寻常的情况下恢复到手工制作的存根。具体来说,有没有办法预先告诉 Moq 我只对验证参数上的特定过滤器感兴趣,而忽略所有其他值?
以下两种方法都不能令人满意。
给定 CUT 和 Dep:
public interface ISomeInterface
{
void SomeMethod(int someValue);
}
public class ClassUnderTest
{
private readonly ISomeInterface _dep;
public ClassUnderTest(ISomeInterface dep)
{
_dep = dep;
}
public void DoWork()
{
for (var i = 0; i < 1000000; i++) // Large number of calls to dep
{
_dep.SomeMethod(i);
}
}
}
起订量策略 1 - 验证
var mockSF = new Mock<ISomeInterface>();
var cut = new ClassUnderTest(mockSF.Object);
cut.DoWork();
mockSF.Verify(mockInt => mockInt.SomeMethod(It.Is<int>(i => i == 12345)),
Times.Once());
mockSF.Verify(mockInt => mockInt.SomeMethod(It.Is<int>(i => i == -1)),
Times.Never());
起订量策略 2 - 回调
var mockSF = new Mock<ISomeInterface>();
var cut = new ClassUnderTest(mockSF.Object);
bool isGoodValueAlreadyUsed = false;
mockSF.Setup(mockInt => mockInt.SomeMethod(It.Is<int>(i => i == 12345)))
.Callback(() =>
{
if (isGoodValueAlreadyUsed)
{
throw new InvalidOperationException();
}
isGoodValueAlreadyUsed = true;
});
mockSF.Setup(mockInt => mockInt.SomeMethod(It.Is<int>(i => i == -1)))
.Callback(() =>
{ throw new InvalidOperationException(); });
cut.DoWork();
Assert.IsTrue(isGoodValueAlreadyUsed);