2015-10-13 16 views
5

Rozumiem, że to nie jest poprawny sposób testowania jednostki, ale mamy ActionFilterAttribute na naszym kontrolerze bazowym, który nigdy nie zostanie wyrzucony podczas naszych testów jednostkowych. Wiem, że powinniśmy przetestować go niezależnie, ale chcemy go zintegrować z naszym ogólnym testem od końca do końca.Atrybut w kontrolerze bazowym nie wyzwalany w testach jednostkowych w mvc5

Jak mogę zintegrować mój atrybut po uruchomieniu testu z odziedziczonym kontrolerem? Rozumiem, że atrybuty nie są powiązane z kontrolerem i częścią struktury mvc.

dzięki ...

+0

trzeba stworzyć test integracji który samodzielnego stosowania serwera hosta –

Odpowiedz

-1

Należy przetestować filtr osobno. Utwórz wymagane obiekty kontekstu kontrolera i użytkownika "filter.OnActionExecuted (actionExecutedContext.Object);" jak składnia.

+0

muszę go zintegrować zupełnie inaczej muszę przepisać wszystkie testy z ręcznie-me-down projektu. Przetestuję filtr działania niezależnie, ale z tego powodu łamie się inne testy. –

0

Dwie opcje myślę. 1 jest to, co już robisz, i nie chciałbym tego zmieniać. 2 to odpowiedź na twój problem. Uważam, że dobrze jest mieć jedno i drugie.

  1. Utrzymuj swoje testy jednostkowe dla sterownika i filtrów oddzielnie. Jest to właściwe dla UT, ponieważ twój kontroler i filtry nie powinny mieć twardych zależności od siebie. W ten sposób dowiesz się, że każdy z nich działa poprawnie we własnym zakresie (Zasada Odpowiedzialności Pojedynczej).
  2. Utwórz osobny zestaw testów, które implementują HttpContextBase. Zakładam, że masz już próbne HttpContextBase robić sesje lub pliki cookie, więc po prostu podkreślę główne rzeczy dla konkretnego filtra. (Jeśli nie, poszukaj HttpContextBase i testów jednostkowych).

    public class MockHttpContext : HttpContextBase { public MockHttpContext() { MockRequest = new Mock<HttpRequestBase>(); // .. etc .. var actionExecutingContext = new Mock<ActionExecutingContext>(); actionExecutingContext.SetupGet(x => x.HttpContext).Returns(this); var filter = new ThemeModelAttribute(); filter.OnActionExecuting(actionExecutingContext.Object); // OnActionExecuted has similar setup if needed. } }

HTH!

0

Sprawdź, które przypisują ThemeModel ma AttributeUsage(Inherited = true)

Powiązane problemy