Модульное тестирование Метод контроллера - присвойте значение свойству базового класса, чтобы избежать использования Initialize () - PullRequest
1 голос
/ 07 февраля 2012

Этот тест должен проверить, что я могу вернуть объект ViewModel, создав клиента и вызвав метод контроллера Details ().

[TestMethod()]
public void Can_View_AccountDetails()
{
       AccountController target = new AccountController(null, null, null, null);
       target.customer = new Customer { Id = 4, Active = true, BillingAddress_Id=1, ShippingAddress_Id=2 };

       //  Act
       ActionResult result = target.Details();
       //  Assert
       var resultData = ((ViewResult)result).ViewData.Model as AccountViewModel;
       Assert.IsInstanceOfType(resultData, (typeof(AccountViewModel)));
}

'customer' является членом базового класса контроллера, который затем назначается в Initialize ().Изначально я ничего не мог назначить ему, но установив его как «открытый», а не «защищенный», я смог использовать его в своем тесте и избегать попытки вызова метода Initialize () базового класса.

EDIT: 'customer' заполняется из объекта Repository, внедренного в конструктор базового класса.

Это правильный способ сделать это?Кажется, что-то неправильно менять уровень доступности, чтобы заставить тест работать.

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

Ответы [ 3 ]

2 голосов
/ 07 февраля 2012

Я думаю, что ваша настоящая проблема в том, что информация о клиенте "волшебным образом" отображается в пределах AccountController. Экземпляр Customer должен быть внедрен в AccountController извне, поскольку он является внешней зависимостью. В таком случае вам не нужно будет делать свойство customer общедоступным, потому что вы сами передаете его в AccountController.

0 голосов
/ 07 февраля 2012

Вам нужно оцепить свой объект репозитория и настроить его так, чтобы он возвращал клиента. Тогда вам не нужно выставлять свойство .customer как public (или internal) - вы просто указываете заглушку репозитория, чтобы она возвращала желаемую:

var repositoryStub = new Mock<IRepository>();
var customer = new Customer { /* ... */ };
repositoryStub.Setup(r => r.GetCustomer()).Returns(customer);

И, естественно, вам нужно инициализировать AccountContoller с зависимостью от заглушки для хранилища (и других, если необходимо):

var accountController = new AccountController(repositoryStub, ...);

Это, конечно, предполагает, что ваш AccountController может принимать зависимость от хранилища.

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

0 голосов
/ 07 февраля 2012

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

Также вы отметили, что это Moq, но я не вижу никаких тестов Mock. Вы должны использовать интерфейсы, представляющие класс Customer, чтобы вы могли макетировать интерфейс ICustomer.

...