c# – 如何在Owin TestServer创建之后更新HttpConfiguration
http配置通常在启动类中设置,绑定到Create方法.
但是如果我想为所有测试启动一个owin服务器一次,但是根据每个测试需要更新其http配置? 这不可能.服务器对象没有任何用处. using (var server = TestServer.Create<Startup>()) { var data = server.HttpClient.GetAsync("/api/data); } 我想为CRUD集成测试做的是存根服务方法 // Do it ONE time fall ALL tests WebApiConfig.Register(config); WebServicesConfig.Register(config); // Do it individually for each test,Update DI registerations with Fake components per test method var builder = new ContainerBuilder(); var mockContext = new Mock<TGBContext>(); var mockService = new Mock<SchoolyearService>(mockContext.Object); mockService.Setup<Task<IEnumerable<SchoolyearDTO>>>(c => c.GetSchoolyearsAsync()).Returns(Task.FromResult(Enumerable.Empty<SchoolyearDTO>())); // builder.RegisterInstance<TGBContext>(); ****** NO NEED for this it works without registering the ctor parameter dependency builder.RegisterInstance<SchoolyearService>(mockService.Object); builder.Update(((AutofacWebApiDependencyResolver)config.DependencyResolver).Container as IContainer); 目前我被迫创建一个TestServer每个测试方法. 这是一个总开销的时间. 解 使HttpConfiguration静态并且此代码应该工作: var builder = new ContainerBuilder(); var mockContext = new Mock<TGBContext>(); var mockService = new Mock<SchoolyearService>(mockContext.Object); mockService.Setup<Task<IEnumerable<SchoolyearDTO>>>(c => c.GetSchoolyearsAsync()).Returns(Task.FromResult(Enumerable.Empty<SchoolyearDTO>())); builder.RegisterInstance<SchoolyearService>(mockService.Object); builder.Update(((AutofacWebApiDependencyResolver)Configuration.DependencyResolver).Container as IContainer); 解决方法
如果要为所有测试启动OWIN服务器一次.
>为所有的测试类声明一个基类 private static readonly TestServer _webServer = TestServer.Create< Startup>(); >声明一个受保护的静态变量来将此服务器公开给所有的测试. 受保护的静态TestServer WebServer {get {return _webServer; }} 这应该解决您的所有测试运行一次实例化Web服务器的问题.如果您不想早日初始化Web服务器,您可以使用延迟实例化等,但重要的是使其静态并在定义时自身进行初始化,以便每个应用程序域一次. 在您的单元测试中访问HttpConfiguration ..这里有一种可能的方式.. >在您的Startup.cs中,声明一个公共属性… public static HttpConfiguration HttpConfiguration {get;私人集} >在Startup.cs类的configure方法中初始化此变量. HttpConfiguration = new HttpConfiguration(); HttpConfiguration.MapHttpAttributeRoutes(); // do more stuff.. setting resolver etc. // and then finally app.UseWebApi(HttpConfiguration); >这个HttpConfiguration属性是你的web api的配置,因为我们把它作为一个公共属性,它应该可以在你的测试项目和所有测试中访问. Startup.HttpConfiguration 您可以访问它来修改依赖关系解析器定义等. Startup.HttpConfiguration.DependencyResolver 请注意,即使您初始化Web服务器,您也可以更新DependencyResolver定义…更新后的定义仍将具有效果. >如果您担心您的HttpConfiguration只是公开可用,那么将启动类放在内部,并使其仅对您的单元测试项目可见. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |