JustMock .NETユニットテスト利器(二)JustMock基礎

7684 ワード

JustMock APIベース
モックはTelerik®JustMockフレームワークの主要クラス.Mockは、インスタンスおよび静的シミュレーションの作成、動作のスケジュールおよび検証に使用します.
ここでは、「Mock」の基本的な使い方について説明します.
まずIooオブジェクトを作成します
 
publicinterfaceIFoo

{

    intBar{get;set;}

    voidToString();

}

 

インスタンスシミュレーションの作成


実Mockインスタンスを作成するには、このMock.Createメソッドまたはその汎用バージョンMock.Createを使用する必要があります.これにより、テスト中の実際のオブジェクトの代わりに虚偽のオブジェクトを作成します.
var foo =Mock.Create();
また、初期化がコンストラクション関数パラメータに渡されるように指定できます.
 
publicclassFoo

{

    publicFoo(int arg)

    {

    }

}

 
 
対応するユニットテストは以下の通りです.
 
[TestMethod]

    publicvoidSimpleTestMethod()

    {

        //Arrange

        var foo =Mock.Create(()=>newFoo(1));

 

        //Assert

        Assert.IsNotNull(foo);

}

 

Arrange

Arrangeメソッドは、シミュレーションメソッドまたは属性呼び出しの動作を変更するために使用される.このセクションで説明した1つまたは複数のサポートされている動作とともに使用されます.
・CallOriginal()-元の方法で実行します.
・DoInstead()-メソッドの呼び出し時にカスタムコードを実行します.
・Initialize()-すべてのフレームワークメソッドを設定します.
・DoNothing()-コールを無視します.このメソッドは可読性にのみ使用され、voidメソッドにのみ適用されます.
・MustBeCalled()-このメソッドがテストの実行中に呼び出されたことを宣言することをマークします.
・Raise()-嘲笑を呈する事件.
・Raises()-メソッドが呼び出されると、イベントが提案されます.
・Returns()-非voidメソッドを使用してカスタム値を返します.
・Throws()-メソッドを呼び出して例外を放出します.
次に、メソッド呼び出しをスケジュールしてカスタム指定値を返す例を示します.
 
[TestMethod]

    publicvoidArrangingAMethodCallToReturnACustomValue()

    {

        //Arrange

        var foo =Mock.Create();

 

        Mock.Arrange(()=> foo.Bar).Returns(10);

}

 
「Arrabge」メソッドではなく、属性セットをシミュレートしたい場合は、「ArrangeSet」メソッドを使用する必要があります.次の例では、プロパティが特定の値に設定されているときに例外を放出する方法を示します.
 
[TestMethod]

    publicvoidArrangingAPropertySetToThrowAnException()

    {

        //Arrange

        var foo =Mock.Create();

 

        Mock.ArrangeSet(()=> foo.Bar=0).Throws();

}

 

Arrange-動的値を持つ式の使用


このArrangeメソッドでは、パラメータ式で動的値を使用することもできます.これにより、lambda式を使用した配列を細かく制御できます.次のシーンを見てみましょう.
 
publicclassBookService

{

    privateIBookRepository repository;

 

    publicBookService(IBookRepository repository)

    {

        this.repository = repository;

    }

 

    publicBookGetSingleBook(int id)

    {

        return repository.GetWhere(book => book.Id== id);

    }

}

 

publicinterfaceIBookRepository

{

    BookGetWhere(Expression> expression);

}

 

publicclassBook

{

    publicintId{get;privateset;}

    publicstringTitle{get;set;}

}

 
ここには、Knowledge Baseから特定の書籍を取得するためのBookServiceがあります.IBookRepositoryには1つの方法しかありません.GetWhereは、パラメータとして付属のBookを返すために使用されます.λ式の指定.Lambda式を使用して特定の属性を持つブックGetSingleBookのBookServiceクラスを取得する方法idを見てみましょう.
次のテストでは、Arrangeフェーズでlambda式を使用します.
 
[TestMethod]

    publicvoidShouldAssertMockForDynamicQueryWhenComparedUsingAVariable()

    {

        //Arrange

        var repository =Mock.Create();

        var expected =newBook{Title="Adventures"};

        var service =newBookService(repository);

 

        Mock.Arrange(()=> repository.GetWhere(book => book.Id==1))

            .Returns(expected)

            .MustBeCalled();

 

        //Act

        var actual = service.GetSingleBook(1);

 

        //Assert

        Assert.AreEqual(actual.Title, expected.Title);

}

 
リポジトリGetWhereメソッドがid=を呼び出されると、返される本は特定の本であるべきであることを指定する.その後、私たちは行動を取った-私たちが実行したGetSingleBook方法、BookService私たちは予想された本が返されると断言した.

コンストラクション関数パラメータから仮想プロパティセットを自動的に配置するには


上記の第1節で説明したように、Mock.Createを使用すると、作成したオブジェクトに初期化パラメータが渡されるコンストラクション関数を指定できます.コンストラクション関数がシミュレーション中のタイプに含まれる仮想属性の値を設定する場合、Mock.Createと同じ方法で使用できます.その結果、仮想属性の値が自動的に並べ替えられます.この特性を示す例を見てみましょう.
 
publicclassItem

    {

        publicvirtualstringName{get;set;}

 

        publicItem(string name)

        {

            Name= name;

        }

    }

 

    [TestMethod]

    publicvoidShouldAutoArrangePropertySetInConstructor()

    {

        //Arrange

        var expected ="name";

        var item =Mock.Create(()=>newItem(expected));

 

        //Assert

        Assert.AreEqual(expected, item.Name);

}

 

Assert検証動作


いくつかのメソッド/プロパティ呼び出しの動作を手配し、操作を実行した後、返される結果または一般的な動作を検証する必要があります.これを使ってAssertメソッドはこれをします.
Assertの配列方法は実際に呼び出されます.
 
[TestMethod]

    publicvoidTestMethodShowingAssertFunctionality()

    {

        //Arrange

        var foo =Mock.Create();

 

        Mock.Arrange(()=> foo.ToString()).MustBeCalled();

 

        //Act

        foo.ToString();

 

        //Assert

        Mock.Assert(foo);

}

 
メソッド呼び出しを手配しなくても、メソッドが呼び出されたかどうかを断言できます.呼び出しメソッドのように属性取得呼び出しを断言することもできます.
 
[TestMethod]

    publicvoidTestMethodShowingAssertFunctionalityOnPropGet()

    {

        //Arrange

        var foo =Mock.Create();

        Mock.Arrange(()=> foo.Bar).Returns(10);

 

        //Act

        var returnValue =foo.Bar;

 

        //Assert

        Assert.AreEqual(10,returnValue);

    }

 
アサーション属性、「使用する必要がある」Mock.AssertSet.使用するシミュレーションを実証するために.AssertSet'では、前述の動作をこのトピックの1つである「MustBeCalled」を使用します.プロパティが実際にテスト実行に設定されていることを確認します.
 
[TestMethod]

    publicvoidTestMethodShowingAssertFunctionalityOnPropSet()

    {

        //Arrange

        var foo =Mock.Create();

        Mock.ArrangeSet(()=> foo.Bar=0).MustBeCalled();

 

        //Act

        foo.Bar=0;

 

        //Assert

        Mock.Assert(foo);

    }

 
この話題を少し複雑な例で完成させましょう.戻り値リストに遭遇する場合があります.次の例では、返されたアイテムの数を検証し、特定のメソッドが呼び出されたことを宣言する方法を示します.
この例では、次のIooRepositoryを使用します.
 
publicinterfaceIFooRepository

{

    ListGetFoos{get;set;}

}

 

[TestMethod]

    publicvoidVerifyingNumbersOfReturnedItemsAndAssertingAMethodIsCalled()

    {

        //Arrange

        var repository =Mock.Create();

 

        List list =newList(){

            newFoo(1),

            newFoo(2),

            newFoo(3),

            newFoo(4),

            newFoo(5)

        };

 

        Mock.Arrange(()=> repository.GetFoos).Returns(list).MustBeCalled();

 

        //Act

        IList foos = repository.GetFoos;

 

        var expected =5;

        var actual = foos.Count;

 

        //Assert

        Assert.AreEqual(expected, actual);

 

        Mock.Assert(repository);

}

 
 
参考文献:
http://docs.telerik.com/devtools/justmock/getting-started/mock#auto-arrange-virtual-properties-set-from-constructor-arguments