Как выполнить модульное тестирование методов частного контроллера в ASP.NET MVC? - PullRequest
1 голос
/ 18 мая 2011

Какова лучшая практика для модульного тестирования частных методов внутри контроллера в ASP.NET MVC?В настоящее время, если я хочу выполнить юнит-тестирование приватного метода внутри контроллера, я должен установить его как публичный, но когда я это делаю, этот метод доступен для Интернета.

- лучший способ переместить методк вспомогательному классу?

Ответы [ 6 ]

2 голосов
/ 18 мая 2011

Вы должны переместить метод в вспомогательный класс, к которому вы извлекли интерфейс.Таким образом, легче выполнить внедрение зависимостей и переключить реализацию, лежащую в основе, или смоделировать ее, если необходимо.
Тестирование частных методов - это запах кода (или тестовый запах).
Используйте трюк InternalsVisibleTo только тогда, когда это необходимо (т.е.используя непроверяемый класс и должен вызвать событие, которое скрыто от вас вызовом защищенной функции).

1 голос
/ 28 сентября 2012

Вы должны использовать закрытый объект, например так:

var privateObject = new PrivateObject(this.controller);
var result = (ActionResult)privateObject.Invoke("RegisterToEvent", shippingAddressID, creditCardID);  
1 голос
/ 18 мая 2011

Вы можете установить метод для внутреннего вместо частного, а затем установить для атрибута InternalsVisibleTo имя вашей тестовой сборки.

Информация о сборке:

[assembly: InternalsVisibleTo("MyTestAssembly")]
0 голосов
/ 23 апреля 2012

Я использовал метод PrivateObject (), но мне нравится предложение Чарлино NonActionAttribute (см. Комментарии к оригинальному вопросу выше).

0 голосов
/ 18 мая 2011

Вы можете обойти эту проблему, ограничив тесты видимыми методами.Любой приватный метод будет использоваться как минимум одним видимым методом (иначе: его можно безопасно удалить).

Поэтому я предлагаю разработать тесты, которые вызывают видимые методы с практическими значениями, чтобы тестировать частные алгоритмы.Если код недоступен с помощью видимых методов - удалите его.

0 голосов
/ 18 мая 2011

Вы можете создать фильтр действий для таких методов тестирования, как этот ...

public class TestActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
         filterContext.HttpContext.Response.Redirect("loginurl");
         //or throw exception or some other action
    }
}

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

[assembly: InternalsVisibleTo("TestAssembly")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...