.net核心中的单元测试Url.Link

时间:2017-02-12 22:38:46

标签: c# unit-testing asp.net-core-mvc .net-core

我正在使用.net核心创建API。 我的一个方法是POST,它插入一条新记录。成功的响应返回201 Created。在.net中我可以使用帮助器CreatedResult,例如

return Created(new Uri(Url.Link("get_method", new { id = record.id })), record);

这将返回具有正确Location位置设置的201响应。 Location标头使用传入请求使用主机名构建URL。

在.net webapi2中进行单元测试时,我可以创建一个自定义的HttpRequestMessage并自己设置主机名。现在,这似乎已经在新的.net核心框架中消失了。

如何模拟传入的请求,以便我可以进行单元测试并创建有效的Location头。

我相信我需要在控制器的HttpContext上模拟HttpRequest。

UserController controller = new UserController();
controller.ControllerContext.HttpContext.Request = ?

如何模拟此Request参数?这是一个只读的财产。

3 个答案:

答案 0 :(得分:5)

从@Nkosi继续我发现我需要模拟IUrlHelper

Mock<IUrlHelper> urlHelper = new Mock<IUrlHelper>();
urlHelper.Setup(x => x.Link(It.IsAny<string>(), It.IsAny<object>())).Returns("http://localhost");

UserController controller = new UserController();
controller.Url = urlHelper.Object

现在,当在控制器内部调用Url.Link时,它会返回https://localhost

答案 1 :(得分:0)

controller.ControllerContext.HttpContext.Request["parameter_name"]

答案 2 :(得分:0)

在Github上检查一些asp.net核心的单元测试,遇到了一个适合你需求的测试。他们的测试使用了Moq

// Arrange
var controller = new UserController();

var request = Mock.Of<HttpRequest>();
var httpContext = new Mock<HttpContext>();
httpContext
    .Setup(c => c.Request)
    .Returns(request);

controller.ControllerContext.HttpContext = httpContext.Object;

// Act
//...