0

NSubstitute はそのドキュメントでこれを言っています:

インターフェイスを返すメソッド [...] は、自動的に代替物自体を返します。

通常はそれで十分です。ただし、これを行うと:

試験方法:

IUnityContainer unity = Substitute.For<IUnityContainer>();
MyMethod(unity);

実際の方法:

    public void MyMethod(IUnityContainer container)
    {
        this.container = container;

        myObject = container.Resolve<ISomeObject>();

        myObject.CallSomeMethod();
    }

Resolve メソッドはクラスを返します。だから嘲笑されない。つまり、 myObject で null を取得し、CallSomeMethod;を呼び出すと null 参照例外が発生します。

モックであるクラスを返すことができればいいのですが(つまり、そのインターフェイスを具体的にオーバーライドしていない限り)。

NSubstituteを使用してこれを取得する方法はありますか?

4

1 に答える 1

2

がインターフェースの場合ISomeObject、これは正常に機能するはずです。自動置換クラスを取得する場合、クラスにはデフォルトのコンストラクターが必要であり、すべてのパブリック メンバーが仮想として宣言されている必要があります。

次のテストに合格します。

public interface IFactory { T Resolve<T>(); }
public interface ISomeObject { void CallSomeMethod(); }

public class Tests
{
    [Test]
    public void Example()
    {
        var factory = Substitute.For<IFactory>();
        MyMethod(factory);
    }
    public void MyMethod(IFactory container)
    {
        var myObject = container.Resolve<ISomeObject>();
        myObject.CallSomeMethod();
    }
}
于 2012-05-16T02:00:25.990 に答える