4

私はRhinoMocksを使用していますが、実際のプロパティとして動作する必要があるプロパティを持つMockがあります。設定すると値が更新され、プロパティが変更されるとPropertyChangedがトリガーされます。

モックオブジェクトのインターフェースは、本質的に次のとおりです。

public interface IFoo
{
    event PropertyChangedEventHandler PropertyChanged;
    int Bar { get; set; }
}

モックを作成するときに、PropertyBehaviorを設定します。これにより、偽の値が実際に更新されます。

var mocks = new MockRepository();
var fakeFoo = mocks.DynamicMock<IFoo>();
SetupResult.For(fakeFoo.Bar).PropertyBehavior();

しかし、値を更新しても、PropertyChangedはトリガーされません。現在、インターフェイスはINotifyPropertyChangedインターフェイスを実装していません。これはインターフェイスであるためです。PropertyChangedをトリガーするにはどうすればよいですか?

4

2 に答える 2

7

リスナーとミューテーターの役割は、同じクラス(アダプターなど)で組み合わせることができますが、両方の役割を一緒にテストしないでください。

PropertyChanged1つのテストでは、リスニングクラスが設計どおりにイベントに反応することを確認するだけです。そのテストでプロパティが変更された原因は気にしません。

[Test]
public void Updates_Caption_when_Bar_PropertyChanged()
{
   var foo = MockRepository.GenerateStub<IFoo>();
   foo.Bar = "sometestvalue1";
   var underTest = new UnderTest(foo);

   // change property and raise PropertyChanged event on mock object
   foo.Bar = "sometestvalue2";
   foo.Raise(x=>x.PropertyChanged+=null,
       foo,
       new PropertyChangedEventArgs("Bar"));

   // assert that the class under test reacted as designed
   Assert.AreEqual("sometestvalue2", underTest.Caption);

   // or if the the expected state change is hard to verify, 
   // you might just verify that the property was at least read
   foo.AssertWasCalled(x => { var y = foo.Bar; } );
}

別のテストでは、クラスが設計どおりにミューテーターの役割を果たしていることを確認します。

[Test]
public void Reset_clears_Foo_Bar()
{
   var foo = MockRepository.GenerateStub<IFoo>();
   foo.Bar = "some string which is not null";
   var underTest = new UnderTest(foo);

   underTest.Reset();

   // assert that the class under test updated the Bar property as designed
   Assert.IsNull(foo.Bar);
}

このように、あなたがやろうとしているように、モックオブジェクトに実際のロジックを入れる必要は決してありません。これには、テスト容易性のためにクラスを設計する必要があります。そのようなテストを既存のクラスに追加することは困難です。したがって、テスト駆動開発の実践。

于 2010-03-01T23:58:04.047 に答える
1

私はRhinoMocksの専門家ではありませんが、私が知っているモックフレームワーク(私が最もよく知っているTypeMock)ではそれをやろうとはしません。

私は次のようなものを実装します:

public class FooFake: IFoo
{
    public event PropertyChangedEventHandler PropertyChanged;
    int _bar;
    public int Bar
    {
       set
       {
           if( PropertyChanged != null )
               PropertyChanged();
           _bar = value;
       }
       get
       {
          return _bar;
       }
    }
}

ごめん。本当に賢いものはありません。しかし、私はこの種のスタブが再利用できるので好きです。

于 2010-03-01T21:19:37.903 に答える