2009-12-09 18 views
26

Szukałem stackoverflow i googled cztery kilka godzin i nadal nie znalazłem żadnego rozwiązania dla mojego "trywialnego" problemu.W jaki sposób mogę przetestować metodę kontrolera, dla której zastosowano atrybut [Autoryzuj]?

Jeśli piszesz test jednostkowy dla przefiltrowanego [Authorize] ActionResult, w jaki sposób rozwiązujesz problem, aby sfałszować tego użytkownika, który został uwierzytelniony?

mam dużo ActionResult metod, które są filtrowane z [Authorize] i chcę, aby przetestować wszystkie moje ActionResult metodami niezależnie od tego czy są one filtrowane [Authorize] czy nie.

Prostym przykładem tego, co mam na myśli:

[TestMethod] 
public void Create_Get_ReturnsView() 
{ 
// Arrange 
var controller = new UserController(); 
// Act 
var result = controller.Create(); 
// Assert 
Assert.IsNotNull(result as ViewResult); 
} 

[Authorize] 
public ActionResult Create() 
{ 
return View("Create"); 
} 

Jak teraz testy nawet nie trafić metody ActionResult powodu [Autoryzacja] Filtr, rzucony wyjątek to: System.NullReferenceException: Object reference not set to an instance of an object.

+1

Jest coś, czego nam nie pokazujesz. Test, który pokazujesz, nie wykonuje * żadnych * filtrów akcji. Może masz kod, który będzie, ale nie ma go w twoim pytaniu. Co powiesz na cały stos wywołań dla błędu, na początek? –

Odpowiedz

25

Ty trzeba kpić z kontekstu twojego kontrolera. Spróbuj użyć Moq

Twój zorganizować będzie wtedy wyglądać tak:

var controller = new UserController(); 
var mock = new Mock<ControllerContext>(); 
mock.SetupGet(x => x.HttpContext.User.Identity.Name).Returns("SOMEUSER"); 
mock.SetupGet(x => x.HttpContext.Request.IsAuthenticated).Returns(true); 
controller.ControllerContext = mock.Object; 

Powinieneś móc następnie wykonać ustawę & Assert.

Jeśli jeszcze tego nie zrobiłeś, zdecydowanie polecam przejrzeć NerdDinner jako przykład strony MVC.

+0

Awsome, działało bezbłędnie ... Dzięki za dużo – Webking

+0

Mogę argumentować, że nie musisz tego naprawdę testować. Atrybut jest już dobrze przetestowany przez zespół, który napisał ASP.NET MVC. Możesz pobrać źródło i przekonać się samemu. –

+8

Nie polega to na sprawdzaniu atrybutu "[Authorized]", chodzi o obejście go w celu przetestowania metod 'ActionResult'. – AndyMcKenna

Powiązane problemy