2012-01-31 95 views
1

我有一個MSpec測試來檢查我的窗體身份驗證是否正確重定向未授權的請求,但測試呼叫到受保護的動作只是徑直到它而不被授權逮住。 從我讀到的人們通常需要假驗證來測試[Authorize]標籤的操作,所以我不明白它是如何直接進入受保護的操作方法的。MVC MSpec測試不打[授權]屬性

如果有人能夠幫助這將是大加讚賞,這是我在使用MSpec第一次嘗試,它看起來像它應該是真正有用的,我只是無法得到它的工作!

控制器:

[Authorize] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View("Index", null); 
    } 
} 

測試:

[Subject("Login and Authentication")] 
public class when_protected_page_invoked 
{ 
    private static HomeController homeController; 
    private static SecurityController securityController; 
    private static ActionResult result; 

    private Establish context =() => 
    { 
     homeController = new HomeController(); 
     securityController = new SecurityController(new SecurityService(new NHibernateRepository<User>(), new NHibernateRepository<Session>())); 
    }; 

    private Because of =() => result = homeController.Index(); 

    private It should_redirect_to_securityController =() => 
     { 
      result.ShouldBeARedirectToRoute().And().ControllerName().ShouldEqual("Security"); 
     }; 
} 

當我運行它失敗,一個異常被返回的ViewResult時刻的考驗,如果我調試它只是返回Home.Index()結果。

+0

如果您調試索引操作,User.Identity.IsAuthenticated返回什麼?也許MSpec在後臺設置爲true – 2012-01-31 10:38:53

+0

HttpContext:null User:null – mckjerral 2012-01-31 10:45:13

+0

[This question](http://stackoverflow.com/questions/669175/unit-testing-asp-net-mvc-authorize-attribute-到驗證重定向到登錄頁面)同一個問題,但與NUnit的建議,授權在所以不能被直接調用控制器來達到路由層踢英寸這是有道理的,但不贊同我所看到的表示你需要僞造認證的部分。 – mckjerral 2012-01-31 10:51:14

回答

3

這很正常。在這種情況下,不執行動作過濾器。你所要做的就是在你的單元測試中調用action方法。單元測試的正確方法,這是驗證該控制器則飾以授權屬性:

Assert.IsTrue(typeof(HomeController).GetCustomAttributes(typeof(AuthorizeAttribute), true).Any()); 

,如果用戶是在一個控制器則飾以授權屬性會重定向到正確的登錄頁面的事實不自動化不是你應該單元測試的東西。這是微軟(希望)已經廣泛測試過的ASP.NET MVC框架的一部分。

+0

是行動過濾器唯一沒有執行的屬性?作爲MSpec測試的一部分,是否會運行'[Inject]'屬性(來自Ninject)? – Greg 2012-03-14 11:46:39

+0

@Greg,不,它不會運行。 – 2012-03-14 11:50:49