5

私は両方のライブラリに不慣れで、大規模なプロジェクトでの使用にコミットする前に、単体テストでのローコード作業の自動モックのオプションを明確にする必要があります。

Google でしばらく時間を費やした後、他の IOC とモッキング製品の組み合わせとは異なり、LightInject+Nsubstitute がユニットの手配段階で何もしないデフォルト モックの宣言を簡素化するための既製のプラグイン ライブラリは利用できないと結論付けました。テスト。

単体テストの範囲だけのために LightInject コンテナーを一時的な拡張モック オブジェクトでオーバーライドする方法について LightInject のドキュメントを読みましたが、単体テストが触れる可能性のある何もしない既定の分離モックについてはどうでしょうか。LightInject コンテナ内での作成を自動化する方法はありますか?

私が探している内部 IOC コンテナーの動作は次のとおりです。

public class LightInject.ServiceContainer
{
..

  public T GetInstance<T)
  {
     if (( this.RegisteredInterfaces.Any( i => i.Itype == T ) == false )
     && ( this.TemporaryUnitTestOverrides.Any( i => i.Itype == T ) == false ))
     && ( /* this container is configured with an automocking delegate */ ))
          return autoMockCreatorDelegate<T>.Invoke();
  }

LightInject の IProxy と Interceptors は、いくつかの内部モック オブジェクト ビルディング ブロックを提供しているようですが、比較すると Nsubstitute ライブラリはフル機能を備えています。

デフォルトで何を意味するのかを明確にし、モックと拡張モックを行いません。

   // default do nothing mock
   var calculator = Substitute.For<ICalculator>();

   // Enhanced mock that will return 3 for .Add(1,2)
   var calculator = Substitute.For<ICalculator>();
   calculator.Add(1, 2).Returns(3);

明らかに、2 番目の拡張タイプのモックは、単体テストごとにローカルで作成する必要があります。

4

2 に答える 2

8

私は LightInject の作成者であり、本当にあなたを助けたいと思っています。

調べて折り返しご連絡いたします。それまでの間、LightInject コンテナへのサード パーティの貢献であるLightInject.AutopMoqでこのライブラリをチェックアウトすることをお勧めします 。NSubstitute の代わりに Moq を使用しますが、一般的な概念は求めているものと似ているはずです。

そうは言っても、オートモッキングをさらに簡素化する作業を少し前に行ったので、それを見て、NSubstitute とどのように統合できるかを見ていきます。

編集

これは、あらゆる「代替」フレームワークで動作する、非常にシンプルな自動モックの実装です。

using System.Diagnostics;
using LightInject;    
using NSubstitute;

public interface IFoo {  }

class Program
{
    static void Main(string[] args)
    {
        var serviceContainer = new ServiceContainer();
        serviceContainer.RegisterFallback((type, s) => true, request => CreateMock(request.ServiceType));            
        var foo = serviceContainer.GetInstance<IFoo>();
        Debug.Assert(foo is IFoo);
    }

    private static object CreateMock(Type serviceType)
    {
        return Substitute.For(new Type[] { serviceType }, null);                                            
    }
}

よろしくお願いします

ベルンハルト・リヒター

于 2014-05-04T08:56:34.447 に答える