但是如果我想为所有测试启动一个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服务器的基类中声明一个私有静态readonly变量.
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只是公开可用,那么将启动类放在内部,并使其仅对您的单元测试项目可见.