2012-11-14 66 views
1

我有以下類有兩個靜態方法Retrieve和RetrieveWithQuery。 在這裏列出的類下面,我已經包含了一個測試的片段。 除測試的最後一個斷言外,所有測試都失敗,並顯示以下消息:使用Moq嘲笑方法的問題

失敗TestMethod2 MoqTest Assert.AreEqual失敗。預期:。實際:<(null)>。

我知道問題可能是我在模擬 中設置的查詢是與RetrieveWithQuery方法中使用的查詢不同的實例。 這就是爲什麼會返回null。

在一個完美的世界裏,我只是重新考慮服務等級,不幸的是我 使用已經生產的遺留代碼。目標是首先完成 測試,然後在更新生產環境之前重新設置代碼並運行迴歸測試。

是否有解決方法或不同的方式來測試?

public class MyService 
{ 
    public virtual string RetrieveMethod(string account) 
    { 
     if (account == "The abc company") 
     { 
      return "Peter Smith"; 
     } 

      return "John Doe"; 
    } 

    public virtual string RetrieveMethod(MyQuery query) 
    { 
     return RetrieveMethod(query.QueryString); 
    } 

    public static string Retrieve(MyService service, string value) 
    { 
     return service.RetrieveMethod(value); 
    } 

    public static string RetrieveWithQuery(MyService service, string value) 
    { 
     var query = new MyQuery 
     { 
      QueryString = value 
     }; 

     return service.RetrieveMethod(query); 
    } 

} 

public class MyQuery 
{ 
    public string QueryString; 
} 



    [TestMethod] 
    public void TestMethod2() 
    { 
     var mockService = new Mock<MyService>(); 

     const string company = "The abc company"; 
     const string expectedContact = "Peter Smith"; 

     var queryAccount = new MyQuery 
         { 
          QueryString = company 
         }; 

     // Setup base retrieve 
     mockService.Setup(myServ => myServ.RetrieveMethod(company)).Returns(expectedContact); 

     // Setup base retrieve with query 
     mockService.Setup(myServ => myServ.RetrieveMethod(queryAccount)).Returns(expectedContact); 

     // test base retrieve with query - PASS 
     Assert.AreEqual(expectedContact, mockService.Object.RetrieveMethod(queryAccount)); 

     // test static method retrieve - PASS 
     Assert.AreEqual(expectedContact, MyService.Retrieve(mockService.Object, company)); 

     // test static method retrieve with query - FAIL 
     Assert.AreEqual(expectedContact, MyService.RetrieveWithQuery(mockService.Object, company)); 
    } 

回答

1

試試這個適合你的設置:

// Setup base retrieve with query 
    mockService.Setup(myServ => myServ.RetrieveMethod(It.Is<Query>(q=>q.QueryString == queryAccount.QueryString)).Returns(expectedContact); 

或者你可以在過載爲的Equals查詢,使得被創建的查詢等於expectedQuery。

Moq QuickStart頁面有很好的例子,這應該有很大的幫助。

+0

感謝您的回覆,我對您提供的答案有另一個問題。如果有另一個對象級別模擬,我將如何去解決這個問題?我試過下面的代碼,它失敗了。 在這種情況下有一個請求和查詢需要被嘲笑: \t \t mockService.Setup(myServ => myServ.RetrieveRequestMethod( It.Is (R => r.Query == It.Is (q => q.QueryString == company))))。returns(expectedContact); – noobie

+0

該特定行將變成'mockService.Setup(myServ => myServ.RetrieveRequestMethod(它是(r => r.Query.QueryString == company))))。返回(expectedContact);'。你應該將匹配約束的主體看作是你在手動模擬中寫的相同的東西。另外,請查看Moq的快速入門頁面和其他文檔,它們非常好:http://code.google.com/p/moq/wiki/QuickStart。 – tallseth