1

这是我的简单代码。

public class Permission
  {
    public string Name { get; set; }
    public bool IsEnable { get; set; }
  }

  public class User
  {
    public virtual List<Permission> Permissions { get; set; }

    public bool ContainPermission(string permissionName)
    {      
      var result = Permissions.Where(p => p.Name == permissionName && p.IsEnable).FirstOrDefault();
      return result != null;
    }
  }

我想测试方法 ContainPermission。我正在使用 Moq 并编写以下代码:

[TestClass]
  public class UserPermissionTest
  {
    [TestMethod]
    public void UserContainPermission_WhenPermissionEnable_ReturnTrue()
    {
      var mockUser = new Mock<User>();

      mockUser.SetupGet(p => p.Permissions).Returns(
        () => new List<Permission>
                {
                  new Permission {Name = "Name", IsEnable = true}
                });

      var user = mockUser.Object;
      var isContainPermission = user.ContainPermission("Name");

      Assert.IsTrue(isContainPermission);
    }
  }

有用!测试方法通过。但我决定再检查一次。我更改了方法 ContainPermission:

public bool ContainPermission(string permissionName)
{
  Permissions.Clear();

  var result = Permissions.Where(p => p.Name == permissionName && p.IsEnable).FirstOrDefault();
  return result != null;
}

我的测试方法也通过了!我不明白为什么?我的代码有什么问题?

4

1 回答 1

0

因为下面这行,任何时候你请求权限,你总会得到一个结果:

mockUser.SetupGet(p => p.Permissions)

当集合为空时,您可以通过编写另一个测试来测试您是否获得了所需的结果,如下所示:

[TestMethod]
public void UserContainPermission_WhenNoPermissions_ReturnFalse()
{
  var mockUser = new Mock<User>();

  mockUser.SetupGet(p => p.Permissions).Returns(
    () => new List<Permission>());

  var user = mockUser.Object;
  var isContainPermission = user.ContainPermission("Name");

  Assert.IsFalse(isContainPermission);
}
于 2012-12-06T12:38:58.337 回答