4

私は FakeItEasy ライブラリを使用して、単体テスト用の偽物を作成しています。

ClassUnderTestメソッドをテストしたい がありますMethodToTest(Data dataObject)。このメソッドは、私が偽造したいインターフェースのメソッドを呼び出しています:

public interface IFoo
{
  void Execute(Action<IDataAccess> action);
}

public class ClassUnderTest
{
  private IFoo _foo;

  public ClassUnderTest(IFoo foo)
  {
    _foo = foo;
  }

  public void MethodToTest(Data dataObject)
  {
    _foo.Execute(dataAccess => dataAccess.Update(dataObject));
  }
}

public interface IDataAccess
{
  void Update(Data data);
}

public class Data
{
  public int Property { get; set; }
}

単体テストでは、テスト メソッドがインターフェイスを正しく (正しいプロパティ値で) 呼び出すかどうかを確認したいと思います。

[TestClass]
public class UnitTest1
{
  [TestMethod]
  public void TestMethod1()
  {
    var foo = A.Fake<IFoo>(x => x.Strict());
    A.CallTo(() => foo.Execute(dataAccess => dataAccess.Update(A<Data>.That.Matches(d => d.Property == 20))));      

    var cut = new ClassUnderTest(foo);

    cut.MethodToTest(new Data { Property = 20 });      
  }
}

しかし、このテストでは何かが間違って設定されています。私は例外を受け取ります:

テスト メソッド TestProject1.UnitTest1.TestMethod1 が例外をスローしました: FakeItEasy.ExpectationException: 厳密な偽の構成されていないメソッド「Execute」への呼び出し。

誰かがCallTo()ステートメントを正しく構成する方法を知っていますか?

4

2 に答える 2

4

更新された例は本当に役に立ちます、@ rhe1980。

最初に、提供したテストに関するメモ:

  1. A.CallToメソッドは何もしません。動作を設定したり (または.Invokesまたは.Returnsを使用.DoesNothing)、メソッドが呼び出されたことを確認したり (たとえば、 を使用.MustHaveHappened) したりしません。
  2. s を比較するActionのは難しいようです。Compare Delegates Action<T>でいくつかのアドバイスを見つけましたが、それが私だったら、少し違うやり方をとります。

デリゲートを参照モデルと比較しようとする代わりに、提供されたアクションをキャプチャして で実行し、アクションが何をするかを確認することで、Actionこれをエミュレートできると考えました。幸いなことに、FakeItEasy がその手助けをしてくれます!ExecuteIDataAccess

私はこのテストで成功しました:

[TestMethod]
public void TestMethod1()
{
    // Arrange
    var foo = A.Fake<IFoo>(x => x.Strict());

    var fakeDataAccess = A.Fake<IDataAccess>();

    A.CallTo(() => foo.Execute(A<Action<IDataAccess>>.Ignored))
                    .Invokes((Action<IDataAccess> action)=>action(fakeDataAccess));

    var cut = new ClassUnderTest(foo);

    // Act
    cut.MethodToTest(new Data { Property = 20 });

    // Assert
    A.CallTo(() => fakeDataAccess.Update(A<Data>.That.Matches(d => d.Property == 20)))
        .MustHaveHappened();
}

お役に立てば幸いです。

于 2013-11-15T03:09:13.530 に答える