通常在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服务器。

  • 声明所有测试类的基类
  • 在OWIN Server的基类中声明一个私有(private)静态只读变量。
  • private static readonly TestServer _webServer = TestServer.Create<Startup>();
  • 声明一个 protected 静态变量,以将该服务器暴露给所有测试。
  • protected static TestServer WebServer { get { return _webServer; } }
    这应该可以解决所有测试运行仅实例化Web服务器一次的问题。如果您不想这么早初始化Web服务器,则可以使用延迟实例化等。但是重点是使其静态并在定义时自行对其进行初始化,以便每个应用程序域一次。

    至于在单元测试中访问HttpConfiguration的方法..这是一种可能的方法。

    在您的Startup.cs中的
  • 中,声明一个公共(public)属性...
  • public static HttpConfiguration HttpConfiguration { get; private set; }
  • 在Startup.cs类的configure方法中初始化此变量。
        HttpConfiguration = new HttpConfiguration();
        HttpConfiguration.MapHttpAttributeRoutes();
    
        // do more stuff.. setting resolver etc.
        // and then finally
    
        app.UseWebApi(HttpConfiguration);
    
  • 此HttpConfiguration属性是您的Web api的配置,并且由于我们将其设为公共(public)属性,因此在您的测试项目和所有测试中都应可以访问它。
        Startup.HttpConfiguration
    

  • 您可以访问它以修改依赖关系解析器的定义等。
            Startup.HttpConfiguration.DependencyResolver
    

    请注意,即使在初始化Web服务器之后,也可以更新DependencyResolver定义。更新后的定义仍将起作用。
  • 如果您担心HttpConfiguration只是公开可用,则将Startup类设置为内部类,并使它仅对您的单元测试项目可见。
  • 关于c# - Owin TestServer创建后如何更新HttpConfiguration,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30914350/

    10-11 05:04