1

実際、私は単体テストを書いています。このために、RhinoMocksを使用しています。

試験方法:

{
   ...
   var classA = repo.StrictMock<IMyInterface>();
   Expect.Call(()=>classA.AddItem()). // call here method cuT.ItemAdded()
   repo.ReplayAll();

   // test
   cuT.DoSomething(classA);

   ...
}

テスト中のクラス:

{
   ...
   public void DoSomething(IMyInterface myInterface)
   {
      myInterface.AddItem();
   }

   public void ItemAdded(object sender, ItemEventArgs e)
   {
     UpdateModel(); // update model only if item wasn't added by AddItem() method called from DoSomething()..
     ...
   }
}

私の質問は、Expect.Call()ステートメントをどのように定義して、インターフェイスで期待されるメソッドPASSWORD()を呼び出すことにより、cuT.ItemAdded()の呼び出しが発生するようにする必要があるかということです。

よろしくお願いします!

よろしく、rhe1980

4

1 に答える 1

0

ここで本当に必要なのは2つのテストです。これは、イベントを使用すると、アイテムの追加が(DoSomethingメソッドとは異なる)異なるソースから発生する可能性があることを示しているためです。

// 1: This test will simply verify that tested method calls dependency
public void DoSomething_AddsItemOnMyInterface()
{
    var myInterface = MocksRepository.GenerateMock<IMyInterface>();
    myInterface.Expect(m => m.AddItem()).Repeat.Once();

    cut.DoSomething(myInterface);

    myInterface.VerifyAllExpectations();
}

// 2: Here we assure that model gets updated when item was added
public void ItemAdded_UpdatesModel_WhenMyInterfaceRaisesEvent()
{
    var myInterface = MocksRepository.GenerateMock<IMyInterface>();
    myInterface.Expect(m => m.AddItem()).Repeat.Once();

    myInterface.Raise(m => m.ItemAddedEvent += null, myInterface,
        new ItemEventArgs());

    // How exactly model is updated when event is raised? The 'how'
    // should be asserted here.
}

たとえば、UpdateModelクラスプロパティをある値に設定している場合は、それをアサートします。一部のコレクションをクリアしていた場合は、assertでコレクションが空であることを確認します。イベント自体は、テストの観点からは興味深いものではありません(条件として考えてください)。興味深いのは、そのイベントが発生したときに何が起こるかコントラクト)です。そして、テストは、実際に起こったことを契約したことを確認する必要があります。

ところで、使用する構文(Record-Replay)は少し古いものです。Rhinoは、より流暢なArrange-Act-Assert構文をサポートするようになりました(ExpectおよびStubメソッドをVerify使用)。詳細については、こちらのwikiページをご覧ください。

于 2012-06-08T09:39:13.050 に答える