1

以下のクラスの「IsUnique」関数の単体テストを次のように記述しようとしています。

class Foo
{
    public bool IsUnique(params...)
    {
       ValidateStuffExists(params);
       return CheckUniqueness(params);
    }

    private void ValidateStuffExists(params)
    {
      //does some validation
    }

    private bool CheckUniqueness(params)
    {
       //does logic to determine if its unique per params
       return result;
    }

}

ここでテストしたいのは、ValidateStuffExistsとCheckUniquenessが呼び出され、引数が渡されることだけです。この関数が行うのはこれだけなので、テストするのはこれだけです(「パブリック動作のみをテストする」という疑似ルールを曲げて、ここでプライベートメソッドをテストします。これは、1つの大きな複雑なメソッド/テストまたは2つのプライベートテストがあるためです。メソッド)。

私はどんなモックライブラリにも門戸を開いています。私はNMockを使用していて、それがタスクに適しているとは思いませんでした-読んだ後、TypeMockをダウンロードしました。これが最高であり、具体的なクラスや非インターフェイスメソッドの呼び出しでさえもモックアウトできると聞きました...

私はテストでこのようなことをしていますが、「Isolate.WhenCalled」行で例外がスローされます。

        CrmEntityUniqueValidator_Accessor target = new CrmEntityUniqueValidator_Accessor(); // TODO: Initialize to an appropriate value
        DynamicEntity entity = null; // TODO: Initialize to an appropriate value
        string[] propertyNames = null; // TODO: Initialize to an appropriate value

        bool tru = true;
        Isolate.WhenCalled(() => target.CheckUniqueness(entity, propertyNames, null, null)).WillReturn(tru);

        target.ValidatePropertiesExist(entity, propertyNames);

        Isolate.Verify.WasCalledWithArguments(() => target.ValidatePropertiesExist(entity, propertyNames));
        Isolate.Verify.WasCalledWithArguments(() => target.CheckUniqueness(entity, propertyNames, null, null));

これにより、 「***WhenCalledはメソッド呼び出しを引数として使用することをサポートしていません」のような例外がスローされます。

CLRクラスでも同じことができますが、DateTimeをモックアウトできます。これを実行すると(コードは機能します):

        DateTime endOfWorld = new DateTime(2012, 12, 23);
        Isolate.WhenCalled(() => DateTime.Now).WillReturn(endOfWorld);
        DateTime dt = DateTime.Now;

        Assert.AreEqual(dt, endOfWorld);

ここで何かアドバイスはありますか?これらの2つのメソッドを別々のクラスに分割し、インターフェイスを作成する必要がありますか?または私の方法/テストを複雑にしますか?ここに欠けているものがあるに違いありません...事前に助けてくれてありがとう。

編集:私は1つのユニットテストのためにクラスの2つのプライベートメソッドをモックアウトしようとしていると思います。これらの2つのメソッドを別々のクラス/インターフェイスに分割せずにこれを行うにはどうすればよいですか?

4

2 に答える 2

3

Isolate.NonPublic.WhenCalled(object、 "nonpublic method")。IgnoreCallを試してください

またはIsolate.Verify.NonPublic.WasCalled(object、"method"。。

于 2010-03-01T20:42:30.237 に答える
0

RhinoMocksには、AssertWasCalledメソッドが別のメソッドを呼び出すことを保証する目的に役立つ可能性のあるメソッドがあります...しかし、単体テストを行っている同じクラスのプライベート関数でそれを実行できるかどうかはわかりません。スタブしたい2つのメソッドが、注入された別の依存関係クラスにある場合にのみ、それを実行できると思います。

于 2010-03-01T20:31:29.030 に答える