2009-07-20 1 views
1

Я издеваюсь над объектом HttpRequest, используя Moq для модульного тестирования в ASP.NET MVC. Мне нужно установить один из ServerVariables (LOGON_USER) в запросе. Это возможно? Я попытался использовать следующий метод, но получаю исключение, потому что коллекция ServerVariables не переопределяется.Установить значение ServerVariable при издевательском HttpRequest с использованием Moq?

request.SetupGet(req => req.ServerVariables["LOGON_USER"]).Returns(@"TestUserName"); 

Возможно ли установить значение ServerVariable для тестирования?

Нужно ли передавать новый NameValueCollection вместо того, чтобы пытаться установить один конкретный ключ?

+0

Смотрите мой ответ здесь: Http: // StackOverflow. ком/а/34194622/573045 – Birey

ответ

0

Ок, понял этот. Я создал этот метод, чтобы создать NameValueCollection для ServerVariables:

private static NameValueCollection CreateServerVariables(string logonUserName) 
{ 
    var collection = new NameValueCollection {{"LOGON_USER", logonUserName}}; 
    return collection; 
} 

Тогда я назвал его, как это в моей конфигурации:

var request = new Mock<HttpRequestBase>(); 

    request.SetupGet(req => req.ServerVariables).Returns(CreateServerVariables(userName)); 
1

Это один из способов сделать это. Я обычно издеваюсь над этими вещами, изменяя правила: я не хочу знать о HttpRequest или его родственниках в моих тестах. Вместо этого я спрашиваю: где я могу получить имя зарегистрированного пользователя, если я должен был решить?

И это было бы ICallerContext или каким бы лучшим именем мы ни придумали. Тогда я издеваюсь над этим интерфейсом.

Мой контроллер нужна ссылка на новую зависимость:

public class MyController 
{ 
    public MyController(ICallerContext caller) {...} 
} 

Мой тест необходимость передавать высмеивал экземпляр контроллера:

var caller = new Mock<ICallerContext>(); 
var controller = new MyController(caller.Object); 

caller.Setup(c => c.LogonUserName).Returns("TestUserName"); 

controller.DoTheMagic(); 

//Assertion(s) goes here...