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 回答