0

FakeItEasyを使用して、呼び出しが発生したことをどのように表明しますか?

ユースケースは、リポジトリで動作するクラスを作成している場合です。メソッドの結果として、クラスは、DeleteAllを呼び出すか、すべての要素に対してDeleteを呼び出すことによって、リポジトリからいくつかの要素を削除する必要があります。

今のところ、私は次のようなtry-catchを使用しました。

try // either
{
    A.CallTo(() => module.CardRepo.Delete(A<CardData>.That.IsEqualTo(dummy.CardData[0]))).MustHaveHappened();
    A.CallTo(() => module.CardRepo.Delete(A<CardData>.That.IsEqualTo(dummy.CardData[1]))).MustHaveHappened();
}
catch (ExpectationException) // or
{
    A.CallTo(() => module.CardRepo.DeleteAll(A<IEnumerable<CardData>>.That.Contains(dummy.CardData[0]))).MustHaveHappened();
    A.CallTo(() => module.CardRepo.DeleteAll(A<IEnumerable<CardData>>.That.Contains(dummy.CardData[1]))).MustHaveHappened();
}

しかし、私はそれが好きではなく、より多くの選択肢のためにそれはすぐに本当に醜くなるでしょう。もっと良い方法はありますか?FakeItEasywikiで何も見つかりませんでした。

4

2 に答える 2

2

これは、偽のオブジェクトで1つ以上のメソッドが呼び出されたかどうかを確認する方法の例です。

 public interface IBlah
{
    void Delete(int x);
    int Add(int x, int y);
    int Subtract(int x, int y);
}

public class Something
{
    private readonly IBlah _blah;

    public Something(IBlah blah) { _blah = blah; }

    public void DoSomething(int x, int y )
    {
      //  _blah.Add(x, y);
        _blah.Subtract(x, y);
    }
}

上記はテストするための簡単なシステムです

   [Fact]
    public void TestFeature()
    {
        var fake = A.Fake<IBlah>();
        var something = new Something(fake);

        something.DoSomething(1, 2);

        var callResults = Fake.GetCalls(fake).Any(call =>
         {
             var x = call.GetArgument<int>("x");
             var y = call.GetArgument<int>("y");
             return call.Method.Name == "Add" || call.Method.Name == "Subtract"
                 && x == 1 && y == 2;
         });

        Assert.True(callResults);
    }

上記の即時スニペットは、パラメーターx = 1、y=2の値を指定してAddまたはSubtractが呼び出されたかどうかを検証するXUnitテストです。

于 2013-02-08T21:48:18.360 に答える
1

正直に言うと、FakeItEasyを使用してこれを実行できるかどうかはわかりませんが、コードを「より見栄えよく」見せるための拡張メソッドを作成することもできますが、一般的には優れたソリューションではないことに同意します。

私が本当に言いたかったのは、ユニットティースティングを通じて決定論的な動作をテストしているので、メソッドへの入力を通じて、DeleteまたはDeleteAllのどちらを呼び出す必要があるかわからないということでした。重要なのは、これらを異なるテストに分割するべきではないということですか?たぶん私はあなたの事件についてここに十分な情報を持っていません。

于 2012-12-11T12:28:17.117 に答える