2016-05-10 35 views
0

我目前正在爲我的項目編寫單元測試,在規定的時間使用HttpContext.Current.User.Identity.Name。不幸的是,我運行測試時無法進行測試,因爲HttpContext爲空。模擬HttpContext.Current.User.Identity.Name

我已經嘗試了一些解決方案,我在互聯網上找到了像Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("rmllcc"), new string[0]);但我無法獲得它的工作。

我正在使用Forms Authenticate system,xUnitMoq。我不是在測試控制器,而是一個Repository,我只是在用戶每次使用特定方法時進行登錄。我怎麼能做到這一點?

+0

所以你傳遞的HttpContext作爲參數傳遞給存儲庫? –

+0

@DanielStackenland不,只是使用它。從我的控制器調用存儲庫,只記錄被記錄的用戶的值和時間。 – Sakuto

+0

不要模擬'HttpContext'。而是創建一個你想要的抽象概念,並把它作爲一個服務傳遞給你的倉庫。關於你所問的問題,有很多問題,你會看到他們中的大多數人都提出這個問題。 – Nkosi

回答

3

我建議你不要使用存儲庫中的HttpContext,創建一個自己的上下文類或一個包裝用戶屬性的接口。

事情是這樣的:

public class MyContext 
    { 
     public MyContext(string username) 
     { 
      Username = username; 
     } 

     public string Username { get; private set; } 

     public static MyContext CreateFromHttpContext(HttpContext httpContext){ 
      return new MyContext(HttpContext.Current.User.Identity.Name); 
     } 
    } 


public class MyRep 
    { 
     private readonly VtContext _context; 

     public MyRep(MyContext context) 
     { 
      _context = context; 
     } 

     ... other repository code... 

    } 

然後就創建在您的測試MyContext

var rep = new MyRep(new MyContext("unittest")); 
2

聽聽你的測試告訴你:使用這個測試很難寫的事實來思考你的代碼的結構。您已將存儲庫層中的依賴項引入到Web應用程序中。這不好。在存儲庫中還有兩件事情正在進行:數據訪問和日誌記錄。

也許將當前用戶包裝在一個抽象中,可以獲得您需要的用戶,但可以很容易地將其剔除。或者你可以將庫包裝在一個裝飾器中,爲你做記錄。

對不起,這不是對問題的直接回答,但是當測試很難寫出來時,通常需要解決更深層的潛在原因。

相關問題