2016-05-01 5 views
0

У меня есть Web Api controller Action method Я пытаюсь выполнить тестирование. У меня есть один настраиваемый фильтр, который запускается перед этим контроллером действия.HttpContext.Current всегда null при отправке запроса из модульного теста

У меня есть вопрос относительно HttpContext.Current.User.Identity.Name что я использую внутри мой пользовательский фильтр действия.

Это хорошо работает, когда я отправляю свой почтовый запрос от веб-клиента.

Но, когда я отправить запрос HTTP POST, от моего модульного тестирования, чем HttpContext.Current всегда жалуются на null

Не понимаю, где и что не так. Кто-нибудь может объяснить это?

Обратите внимание, что я видел ответы на here, но не знаю, где мне нужно добавить этот код в моем случае.

ответ

1

Единичное тестирование - это не то же самое, что вызывать ваш api через веб-клиента.

Когда вы используете веб-клиент, вы используете api в контексте вашего веб-сервера (например, IIS), и веб-сервер предоставит системе che «current» HttpContext.

Если вы называете код простым и простым с помощью единичного тестового метода, вы не работаете в контексте веб-сервера, но вы называете его просто как метод класса. Очевидно, вы можете это сделать, но вам нужно «mock» (из фальшивки, если хотите) текущего HttpContext, чтобы имитировать, что вы работаете на реальном веб-сервере.

Проверьте это SO ответ на вопрос о том, как это сделать.

BTW, это не тот случай, когда вы запускаете интеграционные тесты (означает вызов реального API через веб-клиент и просто проверку результатов ввода-вывода): в этом случае вы используете свой реальный код в реальном контексте и все будет хорошо работать.

0

HttpContext.Current не установлен в самодельном сценарии, как в вашем тесте.

Вы можете создать обертку вокруг HttpContext.Current и заполнить ее перед запуском вашего теста. Как это:

public static class CurrentHttpContext 
{ 
    public static Func<HttpContextBase> Instance =() => new HttpContextWrapper(HttpContext.Current); 
} 

А потом где-то в тесте, где вы создали свой HttpSelfHostServer, вы заселить CurrentHttpContext.Instance. Например, с FakeItEasy (https://github.com/FakeItEasy/FakeItEasy):

var context = A.Fake<HttpContextBase>(); 
CurrentHttpContext.Instance =() => context; 

Тогда вы можете получить доступ к CurrentHttpContext.Instance вместо HttpContext.Current в фильтрах:

public class MyAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var context = CurrentHttpContext.Instance(); 
     // stuff 
    } 
}