我已经将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;
答案 0 :(得分:2)
如果要在测试时使用Autofac引导程序,则需要使用Browser(INancyBootstrapper bootstrapper, Action<BrowserContext> defaults = null)
构造函数并显式指定引导程序的实例。
这种方法的问题在于,你很难替换&#34;用于测试目的的组件,即使用模拟等,这就是ConfigurableBootstrapper
存在的原因。我也不太确定它会如何影响模块发现。使用ConfigurableBootstrapper
,您明确说明要与其他服务一起使用哪些模块。