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 に答える