7

これがばかげた質問に出くわしたら申し訳ありませんが、単体テストの作成を開始する方法がわからないだけです。

API と単体テスト プロジェクトを含むソリューションがあります。API には、ninject を使用したデータ アクセスに使用されるリポジトリ/インターフェイスがあります。

私の質問は、API コントローラーを単体テストするための最良の方法はどのようなものかということです。Moq について少し読んだことがありますが、データベースに対してテストしたいので、Moq を使用する必要があるかどうかはわかりません。

[TestInitialize]属性を使用する必要があることを読みました

[TestInitialize]
public void MyTestInitialize()
{
  var kernel = NinjectWebCommon.CreatePublicKernel();
  kernel.Bind<BusinessController>().ToSelf();
}

私の問題は、私のテスト プロジェクトが CreatePublicKernel を解決できないことです API の NinjectWebCommon クラスをチェックすると、CreatePublicKernel という関数がありません。

ここで何が欠けていますか?

4

1 に答える 1

9

Ninject (または他の DI ライブラリ) は、コントローラーのコンストラクターに依存関係を提供するためだけに使用されます。たとえば、BusinessController2 つのリポジトリが必要な場合、コントローラーには、これらの依存関係を想定するコンストラクターが必要です。

public BusinessController(IUserRepository userRepository, 
                          IOrderRepository orderRepository)
{
    _userRepository = userRepository;
    _orderRepository = orderRepository;
}

コントローラーの単体テストを作成する場合は、これらのリポジトリのモック実装を提供する必要があります。または他のフレームワークを使用Moqしてモックを作成します。

var userRepositoryMock = new Mock<IUserRepository>();
var orderRepositoryMock = new Mock<IOrderRepository>();
// setup mocks here
var controller = new BusinessController(userRepositoryMock.Object,
                                        orderRepositoryMock.Object);

コントローラーの統合テストを作成している場合は、実際のデータベースを使用するこれらのリポジトリの実際の実装を提供する必要があります。

var userRepository = new NHibernateUserRepository();
var orderRepository = new NHibernateOrderRepository();
// prepare some data in database here
var controller = new BusinessController(userRepository, orderRepository);

テストからコードの重複を取り除くために、各テスト (SetUp または TestInitialize メソッド) の前に実行されるメソッドにコントローラーのインスタンス化を移動できます。


更新: 統合テストに Ninject を使用することもできます。実際のアプリケーションと統合テストの両方で使用される Ninject モジュールを作成するだけです。

public class FooModule : NinjectModule
{
    public override void Load()
    {
        Bind<IUserRepository>().To<NHibernateUserRepository>();
        Bind<IOrderRepository>().To<NHibernateOrderRepository>();
        Bind<BusinessController>().ToSelf();
    }
}

次に、このモジュールを使用して、NinjectWebCommon.CreateKernel メソッドでカーネルを作成し、テストでカーネルを作成します。

var kernel = new StandardKernel(new FooModule());
var controller = kernel.Get<ValuesController>();
于 2013-10-21T10:43:31.523 に答える