2

コメントはコードをサポートできないようです

メソッド(SaveTicketなど)を呼び出し、コンストラクター(Repository、Loggingなど)を使用してさまざまなモックインターフェイスを挿入したとします。そのメソッドが別のオブジェクトを呼び出し、そのメソッド内に非プリミティブオブジェクトを作成する場合。その非プリミティブオブジェクトの値をテストする簡単な方法はありますか?

その非プリミティブオブジェクトをプロパティに置き換えて注入することは可能だと思います。またはLastCall.Constraintsを使用します。もっと良い方法はありますか?

次に、Repository.save(t);を検証するための例(以下の例)を示します。

tの正しい値で呼び出されます

  1. lastcall.constraintsを実行します

  2. lastcall.ignorearguments

もっと良い方法はありますか?

CreateMyTicket(int ticketnumber, string name)
{
   ticketobject t = new ticketObject(ticketnumber, name);
   t.upgrade = ticketnumber+2;
   Repository.save(t);
}
4

2 に答える 2

3

例を見てみましょう。CreateMyTicket次のクラスがあり、メソッドの単体テストを行うとします。

public class ClassToTest
{
    public IRepository Repository { get; private set; }

    public ClassToTest(IRepository repository)
    {
        Repository = repository;
    }

    public void CreateMyTicket(int ticketnumber, string name)
    {
        var t = new TicketObject(ticketnumber, name);
        t.Upgrade = ticketnumber + 2;
        Repository.Save(t);
    }
}

IRepositoryこれは、インターフェースがあることを前提としています。

public interface IRepository
{
    void Save(TicketObject t);
}

サンプルの単体テストは次のようになります。

[TestMethod]
public void CreateMyTicketTest() 
{
    // arrange
    var repositoryStub = MockRepository.GenerateStub<IRepository>();
    var sut = new ClassToTest(repositoryStub);
    var ticketNumber = 5;
    var name = "John";

    // act
    sut.CreateMyTicket(ticketNumber, name);

    // assert
    repositoryStub.AssertWasCalled(
        x => x.Save(
            Arg<TicketObject>.Matches(t => 
                t.Upgrade == 7 && 
                t.Name == name && 
                t.TicketNumber == ticketNumber
            )
        )
    );
}
于 2012-05-16T09:27:26.423 に答える
0

モックされた依存関係(リポジトリ、ロギング)で呼び出されたメソッドのみをテストする必要があります。モックから返されたオブジェクトを検証しても、何も得られません(手動で作成したものを検証し、戻り結果として設定するため)。

于 2012-05-16T08:02:10.833 に答える