【问题标题】:How to unit test this如何对此进行单元测试
【发布时间】:2011-02-01 21:20:54
【问题描述】:

我正在尝试为我的一个服务层编写我的第一个单元测试。我正在使用 nunit 和 moq(最新版本)。

我有一个 repo,但我会嘲笑它没问题。

 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 的权限级别的用户对象。

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

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

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

【问题讨论】:

  • 你要测试什么代码? GetPermissions 或“// 其他一些东西”?
  • dv-Jan de Vaan- 我猜的其他东西。基本上是一个 if 语句来检查权限,然后如果好创建一个任务(我的回购中的另一件事)。如果不是,则验证错误。我需要先通过这个方法,它必须返回一个大于 0 的计数器。

标签: c# unit-testing nunit moq


【解决方案1】:

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

【讨论】:

  • autofixture + auto moq 能帮我制作这些物品吗?就像我说的,我不知道如何制作 id,因为它是一个私有集(因为就像我说的那样,这似乎是使用 nhibernate 确保无法设置自动生成的 id 的标准方式)。
【解决方案2】:

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

问候, 莫腾

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 2012-01-08
    • 2019-11-02
    • 1970-01-01
    相关资源
    最近更新 更多