C# 如何对此进行单元测试

C# 如何对此进行单元测试,c#,unit-testing,nunit,moq,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)

我正在尝试为我的一个服务层编写我的第一个单元测试。我正在使用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;
    }
public void创建(字符串电子邮件,int-id)
{
User User=Repo.GetUserByEmail(email);//模拟这个,并返回一个模拟用户。
如果用户!=null)
{
//检查权限
var clearence=GetPermissions(用户,PermissionTypes.Add,id);
//一些其他的东西
}
}
私有静态列表GetPermissions(用户用户、PermissionTypes PermissionRequired、int id)
{
List clearence=user.PermissionLevels.Where(u=>u.id==id&&
(u.Permission.Name==PermissionNeeded | | u.Permission.Name==PermissionTypes.Owner)).ToList();
回归清晰;
}
这就是我所拥有的

现在我得到的是这个许可。我不知道怎么做。我不确定是否必须创建一个用户对象,其中包含一个id的PermissionLevel

我不确定我是否可以模拟它,但我怀疑它,因为它是私人的

第二个问题是我不确定如何创建一个“id”,因为“id”在一个具有私有集的域类中,因为这是nhibernate使用的标准


所以我不知道该如何解决这个问题。

是的,假设你在模仿GetUserByEmail,你可以让它返回一个包含一组示例权限的用户

我会将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

您想测试什么代码<代码>获取权限或“//其他东西”?dv Jan de Vaan-我猜是其他东西。基本上是一个if语句来检查权限,然后if good创建一个任务(我的repo中的另一件事)。如果没有,则验证错误。我需要先使用这个方法,它必须返回一个大于0的计数器。autofixture+auto moq能帮助我创建这些对象吗。就像我说的,我不知道如何设置id,因为它是一个私有集(就像我说的,这似乎是使用nhibernate进行设置的标准方法,以确保无法设置自动生成的id)。