1

関数を実行するロジックをテストする必要があります。その後、パラメーターのプロパティを変更し、更新されたパラメーターで同じ関数を実行します。

これを説明するために、サンプル コードを次に示します。

インターフェース: public interface IWorker { MyObjectB DoWork(MyObject myObject); }

MyObjectB: public class MyObjectB { public string Message { get; set; } }

実装:

public MyObjectB DoWork(IWorker worker, MyObject myObject)
{
    worker.DoWork(myObject);
    myObject.Name = "PersonB";
    worker.DoWork(myObject);
    return new MyObjectB() { Message = "Done" };
}

テスト:

    public void RhinoMocksSampleTest()
    {
     var workerStub = MockRepository.GenerateStub<IWorker>();
     workerStub.Stub(n => n.DoWork(Arg<MyObject>.Is.Anything));

     var myObj = new MyObject { Id = 1, Name = "PersonA" };

     var p = new Program();
     p.DoWork(workerStub, myObj);

     workerStub.AssertWasCalled(d => d.DoWork(Arg<MyObject>.Matches(r => r.Name == "PersonA")));

     workerStub.AssertWasCalled(d => d.DoWork(Arg<MyObject>.Matches(r => r.Name == "PersonB")));
    }

値が「PersonB」であるため、最初の AssertWasCalled は失敗します。最初の呼び出しでオブジェクトの状態をテストするために使用できる関数/呼び出しはありますか?

4

2 に答える 2

1

あなたがやろうとしていることを私がどのように行うかは次のとおりです。

public void RhinoMocksSampleTest()
{
    var workerMock = MockRepository.GenerateMock<IWorker>();
    workerMock.Expect(d => d.DoWork(Arg<MyObject>.Matches(r => r.Name == "PersonA")));
    workerMock.Expect(d => d.DoWork(Arg<MyObject>.Matches(r => r.Name == "PersonB")));

    var myObj = new MyObject { Id = 1, Name = "PersonA" };
    var p = new Program();
    p.DoWork(workerMock , myObj);

    workerMock.VerifyAllExpectations();
}
于 2012-12-17T17:52:51.700 に答える
0

aprescott が提供した素晴らしい回答に加えて、状況によっては役立つ別のアプローチを示すことができます。

アイデアは、興味深い値をコレクションに手動で保存することです。次に、コレクションに必要なシーケンスが含まれていることをアサートできます。

    public void MyTest()
    {
        // that is list which will contain passed names
        var actualNames = new List<string>();

        // stub only saves passed Name property into list
        var workerStub = MockRepository.GenerateStub<IWorker>();
        workerStub
            .Stub(w => w.DoWork(Arg<MyObject>.Is.Anything))
            .Do((Action<MyObject>)(mo => actualNames.Add(mo.Name)));

        var myObject = new MyObject { Name = "PersonA" };
        var target = new MyWorker();

        target.DoWork(workerStub, myObject);

        // here we do assert that names list contains what is required
        Assert.That(actualNames, Is.EqualTo(new[] { "PersonA", "PersonB" }));
    }

PS。ええ、呼び出し順序が正しいことを確認する必要がある場合に機能します:)

于 2012-12-17T20:10:02.523 に答える