我正在构建将在IIS环境中托管的Web API应用程序。为了执行我的服务的端到端集成测试(不模拟),我使用了OWIN。
问题在我的服务体系结构中深处,在存储库层,我正在使用HttpContext.Current
从标头(例如UserId)中检索值。 See this answer
如果您查看上面的代码,我将在整个应用程序中使用GetUserInfo
方法来获取当前的用户信息。另一种方法是将其作为所有方法中的参数传递(我个人不希望这样做)。
我经历了很棒的answer,即将IOwinContext
包含到存储库中。我已经尝试过了,它可以用于自托管,但是我的最终目标是在IIS上部署应用程序。
我的问题:
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()
返回模拟响应。到目前为止,我不知道如何将模拟服务注入到实际的控制器方法调用中。有什么建议吗?
答案 0 :(得分:1)
根据@Nkosi的建议,我能够模拟HeaderService
进行集成测试。
代码如下:
var container = new UnityContainer();
var mock = new Mock<IHeaderService>();
mock.Setup(x => x.GetHeaderFromHttpRequest()).Returns("MockId");
container.RegisterInstance(mock.Object);
答案 1 :(得分:0)
我遵循了这个主题,并在我的旧项目中使用了HttpContextBase
。
Moq: unit testing a method relying on HttpContext
HttpContextWrapper
是HttpContext类的包装,可以像这样构造HttpContextWrapper:
var wrapper = new HttpContextWrapper(HttpContext.Current);
您可以模拟HttpContextBase
并使用Moq设置对它的期望
var mockContext = new Mock<HttpContextBase>();