2011-11-29 60 views
2

我試圖嘲笑繼承了som泛型方法的基類的用戶服務。我無法嘲笑對RetrieveEntitiesTest的調用。使用moq 4.0嘲笑泛型類型的基類方法

當我打電話var validated = _userServiceMock.Object.ValidateUser(email, password);的acctual實施RetrieveEntitiesTest的執行...

這可能嗎? U可以代表我的代碼如下:

public class BaseService 
{ 
    public virtual bool RetrieveEntitiesTest<T>(QueryExpression query) 
    { 
     return false; 
    } 
} 

public class UserService : BaseService 
{ 
    public bool ValidateUser(string username, string password) 
    { 
     // adding query parameters 
     var query = new QueryExpression(); 

     var userCount = RetrieveEntitiesTest<User>(query); 

     return userCount > 0; 
    } 
} 

[TestFixture] 
public class UserServiceTests 
{ 
    private Mock<UserService> _userServiceMock; 

    [TestFixtureSetUp] 
    public void TestFixtureSetUp() 
    { 
     _userServiceMock = new Mock<UserService>(); 
    } 

    [Test] 
    public void ValidateLogin_ValidEmailValidPassword_ValidatedAndReturnsTrue() 
    { 
     string email = "[email protected]"; 
     string password = "password"; 
     var query = ..... 

     _userServiceMock.Setup(x => x.RetrieveEntitiesTest<User>(new QueryExpression())).Returns(true); 

     var validated = _userServiceMock.Object.ValidateUser(email, password); 

     Assert.IsTrue(validated); 
    } 
} 
+0

[懲戒與Moq的基類的方法調用]的可能重複(http://stackoverflow.com/questions/1293151/mocking-a- base-class-method-call-with-moq) –

回答

3

你沒有正確設置你的模擬。使用It.IsAny(請參閱匹配參數部分),而不是一個新QueryExpression:

_userServiceMock 
    .Setup(x => x.RetrieveEntitiesTest<User>(It.IsAny<QueryExpression>())) 
    .Returns(true); 
+0

我可以完全刪除參數,它不會有任何區別 – Kulvis

+0

有趣的...你確定你原來的RetrieveEntitiesTest被調用嗎?你可以用方法中的斷點調試測試嗎?因爲我根據你的代碼創建了一個小的repro,並且使用It.IsAny <>,所以測試對我來說是綠色的。 – nemesv

+0

嗯...該方法被調用並返回false。斷點被擊中。 – Kulvis