使用Autofac进行NancyFX功能测试

时间:2014-09-14 20:34:54

标签: autofac functional-testing nancy

我已经将Autofac作为我选择的DI容器来代替TancyIoC,这是Nancy的默认设置。

我的API工作正常,我可以通过浏览器轻松连接到它,但是我的功能测试失败了。他们失败是因为我试图使用Nancy Browser来设置测试,但它需要TinyIoC容器(不存在)。

是否有一种简单的方法来扩展/覆盖浏览器以获取Autofac容器而不是TinyIoC容器?或者(可能更好),是否有“可以”使用不同容器的Nancy.Testing浏览器?

  

SetUp:System.InvalidOperationException:出错时出错了   试图在组合期间满足其中一个依赖关系,make   确保您已在容器中注册了所有新的依赖项   检查innerexception以获取更多详细信息。 ---->   Nancy.TinyIoc.TinyIoCResolutionException:无法解析类型:   Nancy.NancyEngine ----> Nancy.TinyIoc.TinyIoCResolutionException:   无法解析类型:Nancy.Routing.DefaultRequestDispatcher ---->   Nancy.TinyIoc.TinyIoCResolutionException:无法解析类型:   Nancy.Routing.DefaultRouteResolver ---->   Nancy.TinyIoc.TinyIoCResolutionException:无法解析类型:   Nancy.Routing.RouteCache ---->   Nancy.TinyIoc.TinyIoCResolutionException:无法解析类型:   TimeTracker.Web.Api.UserModule ---->   Nancy.TinyIoc.TinyIoCResolutionException:无法解析类型:   TimeTracker.Services.IUserService

如您所见,TinyIoC无法解析IUserService。

  

Nancy.TinyIoc.TinyIoCResolutionException:无法解析类型:   TimeTracker.Services.IUserService

这是因为我没有在TinyIoC中注册任何内容......相反,我正在使用Autofac进行注册。

    [TestFixtureSetUp]
    public void Setup()
    {
        _browser = new Browser(with =>
            {
                with.Module<UserModule>();

                // forcing me to use TinyIoCContainer
                with.ApplicationStartup((x, pipelines) =>
                    {
                        var container = BootStrapper.ConfigureContainer(new ContainerBuilder().Build());

                        var userValidator = container.Resolve<IUserValidator>();
                        var basicAuthConfig = new BasicAuthenticationConfiguration(userValidator, "TimeTra.ca");
                        pipelines.EnableBasicAuthentication(basicAuthConfig);

                        pipelines.OnError.AddItemToEndOfPipeline(
                            (context, exception) => CustomErrorResponse.FromException(exception));

                        // Setup a clean database
                        var migrationRunner = new MigrationRunner(container.Resolve<IDbProvider>());
                        migrationRunner.DropDatabase();
                        migrationRunner.CreateDatabase();

                        BootStrapper.RunMigrations(container);
                        SeedData.SetupFixtureDataInDatabase(container.Resolve<IServiceLocator>());
                    });
            });
    }

    private Browser _browser;

1 个答案:

答案 0 :(得分:2)

如果要在测试时使用Autofac引导程序,则需要使用Browser(INancyBootstrapper bootstrapper, Action<BrowserContext> defaults = null)构造函数并显式指定引导程序的实例。

这种方法的问题在于,你很难替换&#34;用于测试目的的组件,即使用模拟等,这就是ConfigurableBootstrapper存在的原因。我也不太确定它会如何影响模块发现。使用ConfigurableBootstrapper,您明确说明要与其他服务一起使用哪些模块。