2012-12-06 113 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