使用moq属性的测试方法

时间:2012-12-06 12:30:25

标签: c# unit-testing moq

这是我的简单代码。

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;
}

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

1 个答案:

答案 0 :(得分: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);
}