3

次のテストコードがあります。

for (int z = 0; z < 1000; z++)
{
    ....
    const int threads = 5;
    CountdownEvent ce = new CountdownEvent(threads);
    for (int i = 0; i < threads; i++)
    {
        ThreadPool.QueueUserWorkItem(delegate
        {
            checkerMock.GetCurrentlyReleasedVersion();
            ce.Signal();
        });
    }

    ce.Wait();
    mock = Mock.Get(checkerMock);
    mock.Verify(a => a.GetCurrentlyReleasedVersion(), Times.Exactly(threads), string.Format("on try {0} failed", z + 1));
}

場合によっては、テストが数回正常に実行されることがあります。ただし、すべてが実行されることはありませ1,000ん。

時々、次のエラーがスローされます。

System.NullReferenceException: Object reference not set to an instance of an object.
   at Moq.MethodCall.Matches(ICallContext call)
   at System.Linq.Enumerable.WhereListIterator`1.MoveNext()
   at System.Linq.Enumerable.Count(IEnumerable`1 source)
   at Moq.Mock.VerifyCalls(Interceptor targetInterceptor, MethodCall expected, Expression expression, Times times)
   at Moq.Mock.Verify(Mock mock, Expression`1 expression, Times times, String failMessage)
   at Moq.Mock`1.Verify(Expression`1 expression, Times times, String failMessage)

また、次のエラーが発生することもあります。

Moq.MockException: on try 14 failed
Expected invocation on the mock exactly 5 times, but was 4 times: a => a.GetCurrentlyReleasedVersion()
No setups configured.

Moqに問題があると思います。それとも私のコードの問題ですか?

カウントダウン イベントを 5 回待機すると、4 回ではなく 5 回呼び出される必要があります。最初のエラーは病気です。

それとも、そのようなシナリオではMoqは単にスレッドセーフではありませんか?

編集:これは問題ではないと思われるテストの一部にすぎません。実際にテストしていたものを削除し、エラーが発生したものを残しました。

4

1 に答える 1