C#-对WebApi控制器进行单元测试

时间:2019-06-23 14:56:02

标签: c# unit-testing

我习惯于用Java测试Web控制器,在Java中,即使在单元测试下,也向该控制器发送了真正的请求。

关于C#,我看到的文档像herehere一样,似乎是检查控制器方法的调用工作流程,而不是整个HTTP消息工作流程。

特别是说我有以下控制器:

public class SessionController : ApiController
{
    [HttpDelete]
    [ResponseType(typeof(IHttpActionResult))]
    [Route("api/v1/sessions/{session-id}")]
    [ActionName("stop_session")]
    [ValidateModel]
    public IHttpActionResult StopSession([FromUri(Name = "session-id")] Guid sessionId)
    {
        Console.WriteLine($"Stopping session {sessionId}");

        SessionRepository.Instance.Remove(sessionId);

        return Ok();
    }
}

如果我创建以下单元测试:

    [TestMethod]
    public void TestStopSession()
    {
        SessionController controller = new SessionController()
        {
            Request = new HttpRequestMessage
            {
                Method = HttpMethod.Get,
                RequestUri = new Uri("http://localhost:9000/api/v1/zada")
            }
        };
        controller.Configuration = new HttpConfiguration();

        var res = controller.StopSession(new Guid());

        Assert.IsInstanceOfType(res, typeof(OkResult));
    }

如您所见,在测试中,我放置了一个不同的URL甚至一个不同的方法,但是单元测试仍然成功通过了。

对整个HTTP工作流程进行单元测试的方式是什么?

1 个答案:

答案 0 :(得分:0)

在这种情况下,您正在测试TestStopSession中的单元SessionController,而不是任何路由,验证等。我认为单元测试是可以的,因为您需要一次测试一个单元

您正在调用方法TestStopSession,所以这里甚至没有进行路由。

  

对整个HTTP工作流程进行单元测试的方式是什么?

那么您需要进行集成或系统测试。您可以启动HTTP侦听器,然后执行原始请求。

但是请记住,不要写很多集成/系统测试。确保知道测试金字塔

enter image description here