何度も呼び出される依存関係をシミュレートするために Moq を使用しているときに、問題が発生しました。を呼び出すとVerify
、Moq は応答に長い時間 (数分) を要し、時々クラッシュします( 「コールド スタート」から実行するために蓄積する必要が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);
}
}
}
Moq 戦略 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());
Moq 戦略 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);