2011-02-01 78 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)

问候, 莫滕