2014-03-26 81 views
-1
[TestMethod] 
public void UnitTestMethod1() 
{ 
    Test1Controller controller = new Test1Controller(); 

    //This call throws NullReferenceException "Object reference not set to an instance of an object." 
    WebSecurity.Login("User1", "password1"); 

    controller.TestMethod(); 
} 

在上面的代碼中如何使WebSecurity.Login調用工作?用戶信息如何從UnitTest傳遞到控制器?

我沒有研究,但它並沒有幫助much

感謝。

+0

http://stackoverflow.com/questions/12408180/how-to-unit-test-methods-that-use- system-web-security-membership-inside –

+0

謝謝,尼爾。 WebSecurity.Login使用FormsAuthentication.SetAuthCookie,它實際上會引發異常。 – yW0K5o

回答

0

你不想測試WebSecurity,只有你自己的代碼 - 所以你需要一種方法來測試你的控制器動作,而不需要提供真實的 WebSecurity類。

有很多方法可以做到這一點,但您的問題的性質來看,我認爲你想最簡單的方法可能(而不是最優雅的),在這種情況下,我會建議你實際上並不測試控制器動作和所有它相關的MVC管道,但拿出你的邏輯和公正的測試,如:

public Test1Controller 
{ 
     public ActionResult SomeMethod() 
     { 
      //do mvc stuff 

      //do WebSecurity stuff 

      //do your stuff 
      MyLogicHere(); 
     } 

    //public only so it can be tested 
    public MyLogicHere() 
    { 
     //the logic in here does not have dependencies on difficult to test types 
    } 
} 

然後在您的測試類,你只是測試Test1Controller.MyLogicHere(這並不需要WebSecuirity)。

如果不是這樣,真正到了與DI,接口,嘲弄等交手......

+0

但MyLogicHere使用WebMatrix.WebData.WebSecurity.CurrentUserId。 – yW0K5o

+0

整個想法是Test1Controller.SomeMethod()使用WebMatrix.WebData.WebSecurity.CurrentUserId來獲取id。然後,您可以將該ID傳遞給MyLogicHere()並輕鬆測試MyLogicHere(),因爲您只需引用CurrentUserId,而不是WebSecurity –

+0

我必須更改代碼以傳遞CurrentUserId,這樣會降低單元測試的價值。 – yW0K5o

相關問題