如何对此进行单元测试

时间:2011-02-01 21:20:55

标签: c# unit-testing nunit moq

我正在尝试为我的一个服务层编写第一个单元测试。我正在使用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的标准。

所以我不确定如何解决这个问题。

2 个答案:

答案 0 :(得分:0)

是的,假设您正在模拟GetUserByEmail,您可以让它返回包含一组示例权限的用户。

答案 1 :(得分: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)

此致 的Morten