1

バックグラウンド スレッドをスピンアップするように設計されたクラスがあり、そこからマネージャーへの呼び出しが行われます。このマネージャーは、単体テストのためにモックされます。関連するコードの断片は次のとおりです。

 MockRepository mocks = new MockRepository();
ICacheManager manager = mocks.CreateMock<ICacheManager>();

Expect.On(manager).Call(manager.CacheSize).Return(100);
mocks.ReplayAll();

CacheJanitor janitor = new CacheJanitor(manager);

// get janitor to do its stuff
// ...

mocks.VerifyAll();

問題は、検証時に 2 つの例外がスローされることです。1 つはテスト スレッドで への呼び出しCacheSizeが予期されていたが発生しなかったことを示し、もう 1 つはバックグラウンド スレッド ( 内CacheJanitor) で への呼び出しがCacheSize発生したが予期されていなかったことを示しています。

明らかに、期待は、それらが作成されたスレッドに類似しています。Rhino Mocks に別のスレッドでの呼び出しを期待するように指示する方法を知っている人はいますか (期待が定義されている時点では存在しません)。

編集:

当面はまだ VS 2005 を使用しているという制約について言及するのを忘れていました。Rhino Mocks のバージョンは 3.4 です - 3.5 で試してみますが、改善点のリストにはこの領域の修正が示されていないようです。

とりあえず、この一連のテスト用に独自のモック オブジェクトを作成し、その中に結果を記録しますが、Rhino モックを使用してこれをきれいに達成できるソリューションがあれば間違いなく感謝します。

4

1 に答える 1

1

わお。それはクレイジーです。私はこの種のことを問題なく行うために MoQ を使用しました。

使用している Rhino のバージョンは何ですか? 3.5 より前の方法で使用しています。おそらく、これはバージョン 3.5 では問題にならないでしょうか?

もう 1 つの方法は、モックに対する期待値の検証を避けることです。(申し訳ありませんが、Rhino の構文には詳しくありませんが、可能かもしれません)。コールバックを使用してテスト関数にローカル変数を設定し、その変数を検証します。

MoQ では、次のようにします。

// Arrange
var called = false;
var mock = new Mock<SomeObject>();            

mock.Expect(x => SomeFunction()).Callback(() => called = true);            

var target = new MultithreadedTarget(mock.Object);            

// Act
target.DoSomethingThatCallsSomeFunctionOnAnotherThreadLol();            

// this part is a bit ugly
// spinlock for a bit to give the other thread a chance
var timeout = 0;
while(!called && timeout++ < 1000)
  Thread.Sleep(1);

// Assert
Assert.IsTrue(called);
于 2008-10-08T13:21:58.767 に答える