Установить значение ServerVariable при издевательстве над HttpRequest с помощью Moq? - PullRequest
1 голос
/ 20 июля 2009

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

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

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

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

Ответы [ 3 ]

1 голос
/ 15 сентября 2009

Это один из способов сделать это. Я обычно высмеиваю эти вещи, меняя правила: я не хочу знать о 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...
0 голосов
/ 20 июля 2009

Хорошо, понял это. Я создал этот метод для создания 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));
...