2017-02-12 5 views
3

Я использую ядро ​​.net, создающее API. Одним из моих методов является POST, который вставляет новую запись. Успешный ответ возвращает 201. В .net я могу использовать помощник CreatedResult, например.Unit Test Url.Link in .net core

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

Это вернет ответ 201 с правильным набором заголовков местоположения. Заголовок заголовка использует входящий запрос для создания URL-адреса с использованием имени хоста.

При модульном тестировании в .net webapi2 я мог бы создать пользовательское HttpRequestMessage и сам установить имя хоста. Теперь это, похоже, исчезло в новой структуре ядра .net.

Как мне высмеять входящий запрос, чтобы я мог выполнить модульный тест и создать допустимый заголовок местоположения.

Я считаю, что мне нужно высмеивать HttpRequest в HttpContext для контроллера.

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

Как я могу искупить этот параметр запроса? Это свойство readonly.

ответ

3

Вслед за @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

0

Проверка некоторых модульных тестов для ядра asp.net на Github, натолкнулась на то, которое должно соответствовать вашим потребностям. Их испытание использовали 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 
//...