0

私は最近、静的、非仮想、封印などの多くの要素を含むいくつかのロジックをテストするために、Pex & Moles の時流に乗りました。最近、いくつかのテストから説明できない動作を見始めました。 .

私がスタブ化したインターフェイスのいくつかのメソッドは void を返すため、スタブをデリゲートに設定し、ブール変数を更新してそれらが呼び出されたことを示します。これが私がやっていることです:

[TestMethod]
[HostType("Moles")]
    public void UnitTestX()
    {
        bool disposeCalled = false;
        bool getCalled = false;

        ClassX classX = new ClassX();
        var data = new SIClassXData
                       {
                           Dispose = () => disposeCalled = true,
                           Get = () => getCalled = true,
                           ClassXGet = () => classX
                       };

        MDataLayerFactory.CreateDataLayerObject(() => (IClassXData)data);

        Assert.IsTrue(disposeCalled);
        Assert.IsTrue(getCalled);
    }

何らかの理由で、このテストを単独で実行すると、上記のアサートは成功します。しかし、(Visual Studio の [ソリューション内のすべてのテストを実行] 機能を使用して) アセンブリ内の他のすべてのテストと共にテストを実行すると、最初のアサートが失敗します。

この問題が発生する理由と、問題を解決するために何を変更する必要があるかを知りたいです。

4

1 に答える 1

1

複数のスレッドを使用してテストを実行する「すべてのテストを実行」の副作用でしょうか? では、Assert が発火するまでに Dispose() が実行されていないのでしょうか?

Dispose() が実行されるまで、ManualResetEvent を使用してテスト メソッドをブロックしてみてください。何かのようなもの;

public void UnitTestX()
{
    // use this to block the test thread until Dispose() is run
    ManualResetEvent mre = new ManualResetEvent(false);

    bool disposeCalled = false;
    bool getCalled = false;

    ClassX classX = new ClassX();
    var data = new SIClassXData
                   {
                       Dispose = () => { 
                          disposeCalled = true; 
                          mre.Set(); // release the test thread now
                       },
                       Get = () => getCalled = true,
                       ClassXGet = () => classX
                   };

    MDataLayerFactory.CreateDataLayerObject(() => (IClassXData)data);

    Assert.IsTrue(mre.WaitOne(1000)); // give it a second to fire
    Assert.IsTrue(disposeCalled);
    Assert.IsTrue(getCalled);
}
于 2012-04-17T22:57:56.203 に答える