c# – 如何在Owin TestServer创建之后更新HttpConfiguration

前端之家收集整理的这篇文章主要介绍了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服务器一次.

>为所有的测试类声明一个基类
>在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只是公开可用,那么将启动类放在内部,并使其仅对您的单元测试项目可见.

猜你在找的C#相关文章