2012-02-29 61 views
3

我在單元測試中嘲笑有困難,所以我舉了一個簡單的例子來說明我的問題。我有以下...需要使用Moq的幫助

public class SomeClass : ISomeInterface 
    { 
     public int ID { get; set; } 
     public string Desc { get; set; } 

     public int Create(SomeClass t) 
     { 
      return 5; 
     } 

     public int Create2(string s) 
     { 
      return 7; 
     } 
    } 

    public interface ISomeInterface 
    { 
     int Create(SomeClass t); 
     int Create2(string s); 
    } 

現在我有兩種方法來測試嘲笑接口

private void TestCreate() 
    { 
     var mocker = new Mock<ISomeInterface>(); 
     mocker.Setup(x => x.Create(new SomeClass())).Returns(3); 
     var result = mocker.Object.Create(new SomeClass()); 
    } 

    private void TestCreate2() 
    { 
     var mocker = new Mock<ISomeInterface>(); 
     mocker.Setup(x => x.Create2("Test")).Returns(4); 
     var result = mocker.Object.Create2("Test"); 
    } 

TestCreate2工作並返回結果嘲笑「4」
TestCreate但是返回「0」,而不是「3」

我需要怎樣才能模擬接受自定義類作爲參數而不是簡單的int和字符串的方法?

回答

3

是的,這是因爲你已經設置TestCreate返回3,當它得到您在安裝調用期間傳入的SomeClass的實例。但是,由於您新建了內聯實例,因此在實際創建調用期間傳入的實例並不相同。下面的任一選項都可以解決您的問題...

private void TestCreate() 
{ 
    var mocker = new Mock<ISomeInterface>(); 
    mocker.Setup(x => x.Create(It.IsAny<SomeClass>())).Returns(3); 
    var result = mocker.Object.Create(new SomeClass()); 
} 

private void TestCreate() 
{ 
    var mocker = new Mock<ISomeInterface>(); 
    var someClass = new SomeClass(); 
    mocker.Setup(x => x.Create(someClass)).Returns(3); 
    var result = mocker.Object.Create(someClass); 
}