Rhino Mocks を使用して、特定の期間内にメソッドが呼び出されたかどうかを確認できるかどうかを知っている人はいますか?
単体テストを書きたいコードは次のとおりです。
while (true)
if (TimeoutErrorStopwatch.IsRunning &&
TimeoutErrorStopwatch.ElapsedMilliseconds > timeoutErrorTime)
{
someClass.HandleError();
}
else
Thread.Sleep(10);
HandleError メソッドが呼び出されたかどうかをチェックして、エラーがキャッチされることを確認する単体テストを作成したいと考えています。このループは独自のバックグラウンド スレッドで実行されているため、メソッドが制約付きで呼び出されたことを確認して、メソッドが特定の時間内に呼び出されたことを確認し続ける方法があるかどうか疑問に思っています。効果のあるもの:
someClass.AssertWasCalled(s => s.HandleError()).Within(10);
私の現在の回避策は、単に呼び出しThread.Sleep(10)
てから使用するAssertWasCalled
ことですが、Rhino Mocks でこのようなものがサポートされているかどうか疑問に思っています。
ありがとう!
- - - 編集 - - -
コメントに照らして、指定された制限時間に達するまでメソッドが呼び出されたかどうかを確認し、失敗した呼び出しの間にスリープする拡張メソッドを作成しました。私は実際にすでにタイマーをモックしました (実際のアプリケーションでは、タイムアウトは 30 分に設定されていますが、テストでは 100 ミリ秒以下のモック値を設定しています)。誰かがこの投稿に出くわした場合に備えて、拡張機能を投稿すると思いました。
public static void AssertWasCalledWithin<T>(this T stub, Action<T> action, long milliseconds)
{
var timer = Stopwatch.StartNew();
var e = new Exception();
while (timer.ElapsedMilliseconds <= milliseconds)
try
{
stub.AssertWasCalled(action);
return;
}
catch (ExpectationViolationException exc)
{
e = exc;
Thread.Sleep(1);
}
throw new ExpectationViolationException(
string.Format(
"The following expectation was not met within the " +
"given time limit of {0} milliseconds: {1}",
milliseconds, e.Message));
}