我正在使用.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参数?这是一个只读的财产。
答案 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
//...