6

コンストラクターに注入された (Nsubstitute を介して) モックされたクラスにアクセスしようとしています。

次のコードを使用していました

var fixture = new Fixture()
    .Customize(new AutoNSubstituteCustomization());

var sut = fixture.Create<MyService>();

sut が正常に作成され、「IFileUtils」と呼ばれるインターフェイスのモック バージョンが「MyService」のコンストラクターに挿入されます。

しかし、私はそれにアクセスする必要があるので、読んだ後、オブジェクトをフリーズする必要があると信じているので、そのようにアクセスできます

var fileUtilMock= fixture.Freeze<Mock<IFileUtils>>();

しかし、「モック」が見つからないため、このコードは Moq 構文であると私は信じています。

通常、クラスの Nsubstitute を作成するには、次のようにします。

var fileUtilMock= Substitute.For<IFileUtils>();

もちろん、これは凍結されていないため、使用されず、コンストラクターに注入されません。

誰でも助けることができますか?

4

2 に答える 2

10

Richard Banks によるこのモッキング ツールの比較記事からの推論と、AutoMoq のしくみに基づいて、次のように考えています。

  • NSubstitute には、 Moq のように theMockと theが分離されていません。Mock.Object
  • AutoFixture.Auto* 拡張機能はSpecimenBuilderNode、インターフェイスの [モックされた] 実装を提供するためにフックします。つまり、動作fixture.Create<IFileUtils>()するはずです。
  • フリーズはvar result = fixture.Create<IFileUtils>(); fixture.Inject(result)

したがって、次のように言えるはずです。

var fileUtilMock = fixture.Freeze<IFileUtils>();
于 2013-06-26T09:25:27.193 に答える
6

インスタンスを作成する前に、自動モック化されたインスタンスをフリーズする必要がありMyServiceます。

更新

Ruben Bartelink が指摘しているように、NSubstitute を使用すると、次のことを行うだけで済みます。

var fixture = new Fixture()
    .Customize(new AutoNSubstituteCustomization());

var substitute = fixture.Freeze<IFileUtils>();

..そして、NSubstitute の拡張メソッドを使用します。

そうすれば、同じ凍結されたインスタンスがMyServiceコンストラクターに提供されます。

インターフェイスの場合IInterface:

public interface IInterface
{
    object MakeIt(object obj);
}

あなたがしなければならないのは、次のことだけです:

 var substitute = fixture.Freeze<IInterface>();
 substitute.MakeIt(dummy).Returns(null);

Returns実際には NSubstitute の拡張メソッドです。

于 2013-06-25T20:17:32.510 に答える