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

时间:2015-06-18 11:40:28

标签: c# asp.net-web-api owin

http配置通常在启动类中设置,该类与Create方法绑定。

但是,如果我想开始所有测试的一次 ,但更新其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);

目前我被迫为每个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);

1 个答案:

答案 0 :(得分:1)

如果你想为所有测试启动一次OWIN服务器。

  1. 为所有测试类声明一个基类
  2. 在OWIN服务器的基类中声明一个私有静态只读变量。
  3. private static readonly TestServer _webServer = TestServer.Create<Startup>();

    1. 声明一个受保护的静态变量,以将此服务器公开给所有测试。
    2. protected static TestServer WebServer { get { return _webServer; } }

      这应解决您在所有测试运行中仅对Web服务器实例化一次的问题。如果您不想这么早地初始化Web服务器,您可以使用延迟实例化等,但重点是使其静态并在定义时自行初始化它,以便每个应用程序域一次。< / p>

      关于在单元测试中访问HttpConfiguration ..这是一种可能的方式..

        在您的Startup.cs中
      1. ,声明一个公共属性......
      2. public static HttpConfiguration HttpConfiguration { get; private set; }

        1. 在Startup.cs类的configure方法中初始化此变量。

              HttpConfiguration = new HttpConfiguration();
              HttpConfiguration.MapHttpAttributeRoutes();
          
              // do more stuff.. setting resolver etc.
              // and then finally
          
              app.UseWebApi(HttpConfiguration);
          
        2. 此HttpConfiguration属性是您的web api配置,因为我们将其设为公共属性,所以应该可以在测试项目和所有测试中访问它。

              Startup.HttpConfiguration
          
        3. 您可以访问它来修改依赖项解析程序定义等。

                  Startup.HttpConfiguration.DependencyResolver
          

          请注意,即使在初始化Web服务器之后,您也可以更新DependencyResolver定义...更新后的定义仍会产生影响。

          1. 如果您担心公开提供的HttpConfiguration,请将Startup类置于内部,并使其仅对您的单元测试项目可见。