1

次のクラスを持つ Web API プロジェクトがあります。このクラスは、基本的にすべてのApiControllerインスタンスを登録して設定していDependencyResolverます。

public class DependencyResolverConfig
{
    public static void Register(HttpConfiguration configuration, ContainerBuilder containerBuilder)
    {
        containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly());
        var container = containerBuilder.Build();
        var resolver = new AutofacWebApiDependencyResolver(container);
        configuration.DependencyResolver = resolver;
    }
}

このクラスが実際にすべての API コントローラーを設定していることをテストするために、次のテストを行いました。

[Test]
public void RegistersApiControllers()
{
    var config = new HttpConfiguration();
    var containerBuilder = Substitute.For<ContainerBuilder>();
    containerBuilder.RegisterApiControllers(Arg.Any<Assembly>());

    DependencyResolverConfig.Register(config, containerBuilder);
    containerBuilder.Received(2).RegisterApiControllers();
}

このテストを実行すると、次の例外が発生しますNSubstitute

NSubstitute.Exceptions.ReceivedCallsException : Expected to receive exactly 2 calls matching:
    RegisterCallback(Action<IComponentRegistry>)
Actually received no matching calls.
Received 2 non-matching calls (non-matching arguments indicated with '*' characters):
    RegisterCallback(*Action<IComponentRegistry>*)
    RegisterCallback(*Action<IComponentRegistry>*)

これは紛らわしい出力です。実際の呼び出しと予想される呼び出しがまったく同じである場合、なぜNSubstitute満足できないのか理解できません。手がかりはありますか?

4

1 に答える 1

2

既に述べたように、RegisterApiControllers は拡張メソッドであり、NSubstitute によってインターセプトできるのは仮想メンバーのみです。

しかし、それはそれほど悪くはありません。テストを通じて、より明確で疎結合の設計を作成する必要があります。Fakes や JustMock などのツールを使用すると、すべてをモックでき、システムを疎結合にする必要はありません。

あなたのテストは役に立たないと思います。コントローラーを登録したからといって、それらを解決できるわけではありません。それらを解決できることをテストすることをお勧めします。このようなもの:

[Test]
public void ResolvesServiceController()
{
    // Arrange
    var configuration = new HttpConfiguration();
    var containerBuilder = new ContainerBuilder();
    DependencyResolverConfig.Register(configuration, containerBuilder);

    // Act
    var controller = configuration.DependencyResolver.GetService(typeof (ServiceController));

    // Assert
    Assert.IsNotNull(controller);
} 

次に、さらにリファクタリングを行うことができます。つまり、コントローラーとその依存関係を登録する Autofac モジュールを作成し、このモジュールを正確にテストします。

于 2013-10-27T19:17:07.673 に答える