gpt4 book ai didi

c# - Web API - owin 中的 HttpContext.Current 问题,用于使用最小起订量进行集成测试

转载 作者:太空宇宙 更新时间:2023-11-03 12:05:29 25 4
gpt4 key购买 nike

我正在构建一个将托管在 IIS 环境中的 Web API 应用程序。为了对我的服务执行端到端集成测试(无模拟),我正在使用 OWIN。

问题出在我的服务架构的深处,在存储库层,我正在使用 HttpContext.Current 从 header (比如 UserId)中检索值。 See this answer

如果您查看上面的代码,我会在整个应用程序中使用 GetUserInfo 方法来获取当前用户信息。另一种方法是在所有方法中将其作为参数传递(我个人不想这样做)。

我经历了这个伟大的answer关于将 IOwinContext 包含到存储库中。我已经尝试过了,它适用于自托管,但我的最终目标是在 IIS 上部署应用程序。

我的问题:

  • 我的代码有什么方法可以同时处理用于集成测试的 OWIN 自托管用例和 IIS 上的实际服务部署吗?
  • 我的架构有什么问题吗?就像我根本不应该使用 OWIN,而是使用 POSTMAN 等其他工具进行测试。

如果需要,我可以发布一些代码。

编辑:

正如@Nkosi 所建议的那样,我可能必须模拟我的 HeaderService 才能执行与 owin 的集成测试。我不确定如何使用 moq 模拟某个方法。这是我的代码。它的精简版是为了尽可能简单。

代码:

public class CreditController : ApiController
{
private readonly ICreditService _creditService;

public CreditController(ICreditService creditService)
{
_creditService = creditService;
}

public IHttpActionResult CreditSummary([FromUri]string requestId)
{
var response = _creditService.GetCreditSummary(requestId);
return Ok(response);
}
}

public class CreditService : ICreditService
{
private readonly IHeaderService _headerService;
private readonly ICreditRepository _creditRepository;

public CreditService(ICreditRepository creditRepository, IHeaderService headerService)
{
_headerService = headerService;
_creditRepository = creditRepository;
}

public CreditObj GetCreditSummary(string req)
{
var userId = _headerService.GetHeaderFromHttpRequest();//Get User
var response = _creditRepository.GetDataFromDatabase(req, userId);
return response;
}
}

public interface IHeaderService
{
string GetHeaderFromHttpRequest();
}

public class HeaderService : IHeaderService
{
public string GetHeaderFromHttpRequest()
{
return HttpContext.Current.Request.Headers["USERID"];
}
}

下面是我的集成测试代码:我使用 OWIN 进行自托管。所以我想调用 Controller 方法,但我的 GetHeaderFromHttpRequest 方法应该返回模拟响应。

[TestClass]
public class IntegrationTest
{
private static HttpClient _client;
private static IDisposable _webApp;

[ClassInitialize]
public static void Init(TestContext testContext)
{
_webApp = WebApp.Start<Startup>(url: Url);
_client = new HttpClient
{
BaseAddress = new Uri(Url)
};
}

[TestMethod]
public void TestDashboard()
{
var headerStub = new Mock<IHeaderService>();
headerStub.Setup(s => s.GetHeaderFromHttpRequest())
.Returns("MockUserId");

var builder = new UriBuilder(Url + "api/Credit/CreditSummary");

HttpResponseMessage responseMessage = _client.GetAsync(builder.ToString()).Result;
Assert.IsNotNull(responseMessage);
}
}

public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
WebApiConfig.Register(config); //This method having all routing/dependancy configuration
app.UseWebApi(config);
}
}

问题:

  • 当我调试这个测试用例时,我如何确保 _headerService.GetHeaderFromHttpRequest() 返回模拟响应。到目前为止,我不知道如何将我的模拟服务注入(inject)到实际的 Controller 方法调用中。

有什么建议吗?

最佳答案

根据@Nkosi 的建议,我能够为我的集成测试模拟 HeaderService

代码如下:

var container = new UnityContainer();

var mock = new Mock<IHeaderService>();
mock.Setup(x => x.GetHeaderFromHttpRequest()).Returns("MockId");
container.RegisterInstance(mock.Object);

关于c# - Web API - owin 中的 HttpContext.Current 问题,用于使用最小起订量进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55286550/

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