gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:15:28 27 4
gpt4 key购买 nike

http 配置通常在绑定(bind)到 Create 方法的启动类中设置。

但是,如果我想为所有测试启动一个 owin 服务器一次,但根据每个测试需要更新它的 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);

目前我被迫为每个测试方法创建一个 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 服务器。

  1. 为所有测试类声明一个基类
  2. 在 OWIN 服务器的基类中声明一个私有(private)静态只读变量。

private static readonly TestServer _webServer = TestServer.Create<Startup>();

  1. 声明一个 protected 静态变量,将此服务器暴露给所有测试。

protected static TestServer WebServer { get { return _webServer; } }

这应该可以解决您在所有测试运行中仅实例化 Web 服务器一次的问题。如果您不想这么早初始化 Web 服务器,您可以使用惰性实例化等。但重点是使其成为静态的并在定义时本身对其进行初始化,以便每个应用程序域一次。

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

  1. 在您的 Startup.cs 中,声明一个公共(public)属性...

public static HttpConfiguration HttpConfiguration { get; private set; }

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

        HttpConfiguration = new HttpConfiguration();
    HttpConfiguration.MapHttpAttributeRoutes();

    // do more stuff.. setting resolver etc.
    // and then finally

    app.UseWebApi(HttpConfiguration);
  2. 此 HttpConfiguration 属性是您的 web api 的配置,因为我们将其设为公共(public)属性,它应该可以在您的测试项目和所有测试中访问。

        Startup.HttpConfiguration

您可以访问它来修改依赖解析器定义等。

        Startup.HttpConfiguration.DependencyResolver

请注意,即使在初始化 Web 服务器后,您也可以更新 DependencyResolver 定义...更新后的定义仍然有效。

  1. 如果您担心您的 HttpConfiguration 只是公开可用,则将 Startup 类设为内部类并使其仅对您的单元测试项目可见。

关于c# - 如何在 Owin TestServer 创建后更新 HttpConfiguration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30914350/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com