2009-12-09 22 views
26

Stackoverflow'u aradım ve birkaç saatliğine googled ve hala "önemsiz" sorunum için herhangi bir çözüm bulunamadı.[Authorize] özniteliğine sahip bir denetleyici yöntemini nasıl test ederim?

Filtre uygulanmış [Authorize] ActionResult için birim sınama yazıyorsanız, sorunun kimliği doğrulandığını nasıl çözüyorsunuz?

Ben [Authorize] ile süzülür ActionResult yöntemlerinin çok şey var ve onlar [Authorize] veya olmasın ile süzülür eğer olursa olsun benim ActionResult yöntemlerin hepsi test etmek istiyorum.

ne demek istediğimi basit bir örnek: Şu an itibarıyla testler bile çünkü atılan [Yetkilendirme] filtre, istisna ActionResult yöntemi basmayın

[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"); 
} 

geçerli: System.NullReferenceException: Object reference not set to an instance of an object.

+1

Bize göstermediğiniz bir şey var. Gösterdiğiniz test * herhangi * eylem filtresi yürütmez. Belki senin olacak bir kodun var, ama senin sorununda değil. Yeni başlayanlar için hatanın tüm çağrı yığını nasıl olur? –

cevap

25

Sen kontrol cihazınız için bir bağlamla uğraşmanız gerekir. Sonra gibi görünecektir düzenlemek Sizin Moq

kullanmayı deneyin:

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; 

Ardından Act & belirt yapmak mümkün olmalıdır.

Henüz yapmadıysanız, örnek MVC sitesi olarak NerdDinner incelemesini öneririm.

+0

Awsome, bu kusursuz çalıştı ... Teşekkürler – Webking

+0

Bunu gerçekten test etmeniz gerekmediğini söyleyebilirim. Öznitelik zaten ASP.NET MVC yazdı ekibi tarafından test edilmiştir. Kaynağı indirebilir ve kendiniz görebilirsiniz. –

+8

'[Authorized]' özniteliğini sınamak için değil, 'ActionResult' yöntemlerini test etmek için etrafından dolaşmak için – AndyMcKenna

İlgili konular