【发布时间】:2014-02-01 17:35:21
【问题描述】:
我想在我的 Web API 上进行集成测试,而不依赖于我的业务层接口。
当这个动作运行时:
1) 我想模拟 _service 对象并验证它是否被调用
2) 我想断言返回了正确的 StatusCode
2 号没问题,但是当我不手动控制/启动 api 控制器的创建时,如何模拟 _service 对象(ISchoolyearService),因为这是在单元测试控制器中完成的任务。但我不想对我的 API 进行单元测试!
[RoutePrefix("api/schoolyears")]
public class SchoolyearController : ApiController
{
private readonly ISchoolyearService _service;
public SchoolyearController(ISchoolyearService service)
{
_service = service;
}
[Route("")]
[HttpPost]
public HttpResponseMessage Post([FromBody]SchoolyearCreateRequest request)
{
_service.CreateSchoolyear(request);
return Request.CreateResponse(HttpStatusCode.Created);
}
【问题讨论】:
-
您是否部署到特定的集成测试环境?您可以简单地在您的 Web.Config 中添加一个键,在特定的测试环境中显示 IntegrationTesting=true,当您为
ISchoolyearService定义注入时,您可以在您的真实实现或您在 IntegrationTesting == true 时创建的模拟服务之间切换。 -
"部署到特定的集成测试环境" ?你说测试自托管与 iis 托管吗?我正在使用 HttpServer 和 HttpClient 进行集成测试。但无论如何我不明白你的建议对我有什么帮助。
-
那么,您使用什么 IoC 将您的真实服务注入 ISchoolyearService?您可以根据 Web.Config 中的键在模拟对象或真实服务之间切换。如果您的问题是关于如何创建模拟对象,您可以手动或使用许多模拟框架来完成,例如 Moq:nuget.org/packages/MOQ。也许你可以指出你的问题的具体细节?
标签: asp.net-web-api mocking integration-testing