2011-02-01 80 views
0

我正在嘗試爲我的一個服務層編寫我的第一個單元測試。我正在使用nunit和moq(最新版本)。如何進行單元測試

我有一個回購,但我會嘲笑那是沒有問題的。

public void Create(string email, int id) 
    { 
      User user = Repo.GetUserByEmail(email); // mock this out. and return a mocked user. 

      if user != null) 
      { 

       // check permission 
       var clearence = GetPermissions(user, PermissionTypes.Add, id); 

       // some other stuff 

      } 
    } 


    private static List<Permissions> GetPermissions(User user, PermissionTypes PermissionNeeded, int id) 
    { 
     List<PermissionLevel> clearence = user.PermissionLevels.Where(u => u.id == id && 
                        (u.Permission.Name == PermissionNeeded || u.Permission.Name == PermissionTypes.Owner)).ToList(); 
     return clearence; 
    } 

這就是我所擁有的。

現在得到我的是這個許可。我不知道該怎麼做。我不確定是否必須創建一個包含id的permissionLevels的用戶對象。

我不確定我是否可以嘲笑它,但我懷疑它,因爲它是私人的。

第二個問題是我不知道如何創建一個「id」,因爲「id」是在一個具有私有設置的域類中,因爲那是用於nhibernate的標準。

所以我不知道如何解決這個問題。

+0

你要測試的代碼? `GetPermissions`或者「//其他的東西」? – 2011-02-01 21:25:43

+0

dv-Jan de Vaan-我猜的其他東西。基本上是if語句來檢查權限,然後如果好的話創建任務(我的回購中有另一件事)。如果沒有,那麼驗證錯誤。我需要首先通過這種方法,但它必須返回一個大於0的計數器。 – chobo2 2011-02-01 21:31:56

回答

0

是的,假設你嘲笑GetUserByEmail,你可以讓它返回一個包含一組樣本權限的用戶。

0

我會將Repo.GetUserByEmail方法包裝在一個單獨的類中,並將其注入到您的類中。像這樣:

public class YourClass 
{ 
    private readonly UserProvider _userProvider; 

    public TestedClass(UserProvider userProvider) 
    { 
     _userProvider = userProvider; 
    } 

    public void Create(string email, int id) 
    { 
     User user = _userProvider.GetUser(email, PermissionTypes.Add, id); // mock this out. and return a mocked user. 

     if (user != null) 
     { 

      // check permission 
      var clearence = GetPermissions(user, PermissionTypes.Add, id); 

      // some other stuff 

     } 
    }   
} 

public class UserProvider 
{ 
    public User GetUser(string email, PermissionTypes.Add, id) 
    { 
     return Repo.GetUserByEmail(email); 
    } 
} 

因此,您可以存根UserProvider類並始終完全控制測試中的用戶。

記住測試UserProvider類和O)

問候, 莫滕