6

Moqを使用することで、モックを検証可能としてセットアップできるようになりました。ご存知のように、これは、テスト対象のコードが実際に依存関係のメソッドを呼び出していることを確認する場合に便利です。

例:Moq:

// Set up the Moq mock to be verified
mockDependency.Setup(x => x.SomethingImportantToKnow()).Verifiable("Darn, this did not get called.");
target = new ClassUnderTest(mockDependency);
// Act on the object under test, using the mock dependency
target.DoThingsThatShouldUseTheDependency();
// Verify the mock was called.
mockDependency.Verify();

私はVS2012の「FakesFramework」(より良い名前がわからないため)を使用してきましたが、これは非常に洗練されており、Moqよりも表現力があり、Shimsを簡単にするために好み始めています。ただし、MoqのVerizable/Verify実装と同様の動作を再現する方法がわかりません。StubsでInstanceObserverプロパティを見つけました。これは私が望むもののように聞こえますが、9/4/12の時点でドキュメントがなく、それが正しいかどうかさえわかりません。

誰かが私を正しい方向に向けて、VS2012の偽物でMoq検証可能/検証のようなことをすることができますか?

--9/5/12編集-
問題の解決策を見つけましたが、VS2012フェイクでそれを行うための組み込みの方法があるかどうかを知りたいです。可能であれば誰かが主張できるように、これは少し開いたままにしておきます。これが私が持っている基本的な考え方です(コンパイルされない場合はお詫びします)。

[TestClass]
public class ClassUnderTestTests
{
    private class Arrangements
    {
        public ClassUnderTest Target;
        public bool SomethingImportantToKnowWasCalled = false;  // Create a flag!
        public Arrangements()
        {
            var mockDependency = new Fakes.StubIDependency  // Fakes sweetness.
            {
                SomethingImportantToKnow = () => { SomethingImportantToKnowWasCalled = true; }  // Set the flag!
            }
            Target = new ClassUnderTest(mockDependency);
        }
    }

    [TestMethod]
    public void DoThingThatShouldUseTheDependency_Condition_Result()
    {
        // arrange
        var arrangements = new Arrangements();
        // act
        arrangements.Target.DoThingThatShouldUseTheDependency();
        // assert
        Assert.IsTrue(arrangements.SomethingImportantToKnowWasCalled);  // Voila!
    }
}

-9/5/12編集終了-

4

2 に答える 2

4

これ以上の解決策は聞いていないので、今のところ、2012 年 9 月 5 日の編集が最善の方法であると呼んでいます。

EDIT ベストプラクティスを説明する魔法の記事を見つけました。http://www.peterprovost.org/blog/2012/11/29/visual-studio-2012-fakes-part-3/

于 2012-09-10T18:10:19.057 に答える
1

複雑なシナリオでは意味があるかもしれませんが、別の (Arrangements) クラスを使用して、呼び出されるメソッドに関する情報を格納する必要はありません。メソッドが Fakes で呼び出されたことを確認する簡単な方法を次に示します。Fakes は、別のクラスのフィールドではなく、ローカル変数に情報を格納します。あなたの例のように、 ClassUnderTest が IDependency インターフェイスのメソッドを呼び出すことを意味します。

[TestMethod]
public void DoThingThatShouldUseTheDependency_Condition_Result()
{
    // arrange
    bool dependencyCalled = false;
    var dependency = new Fakes.StubIDependency()
    {
        DoStuff = () => dependencyCalled = true;
    }
    var target = new ClassUnderTest(dependency);

    // act
    target.DoStuff();

    // assert
    Assert.IsTrue(dependencyCalled);
}
于 2012-10-26T17:56:47.433 に答える