2012-12-06 91 views
1

这是我的简单代码。使用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; 
} 

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

+0

使用调试器可以帮助你。你确定。清除()清除? –

+0

Ofc。我很抱歉 - 我想我会失明! –

回答

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); 
} 
+0

我明白了。谢谢! – mnsasha