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