通常在te Startup类中设置http配置,该类绑定(bind)到Create方法。
但是,如果我想启动owt服务器一次一次,以便进行所有测试,但是根据每次测试的需要更新的http配置,该怎么办?
这不可能。服务器对象没有任何用处。using (var server = TestServer.Create<Startup>())
{
var data = server.HttpClient.GetAsync("/api/data);
}
我想对CRUD集成测试做的是对服务方法进行 stub // 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);
目前,我被迫为每个Test方法创建一个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>();
protected static TestServer WebServer { get { return _webServer; } }
这应该可以解决所有测试运行仅实例化Web服务器一次的问题。如果您不想这么早初始化Web服务器,则可以使用延迟实例化等。但是重点是使其静态并在定义时自行对其进行初始化,以便每个应用程序域一次。
至于在单元测试中访问HttpConfiguration的方法..这是一种可能的方法。
在您的Startup.cs中的
public static HttpConfiguration HttpConfiguration { get; private set; }
HttpConfiguration = new HttpConfiguration();
HttpConfiguration.MapHttpAttributeRoutes();
// do more stuff.. setting resolver etc.
// and then finally
app.UseWebApi(HttpConfiguration);
Startup.HttpConfiguration
您可以访问它以修改依赖关系解析器的定义等。
Startup.HttpConfiguration.DependencyResolver
请注意,即使在初始化Web服务器之后,也可以更新DependencyResolver定义。更新后的定义仍将起作用。
关于c# - Owin TestServer创建后如何更新HttpConfiguration,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30914350/