2017-06-01 51 views
1

我正在嘗試爲我的代碼設置一個簡單的單元測試。我有一個接口和實現,通過WCF與外部服務對話。我試圖用下面的代碼來嘲笑這個;使用Moq的嘲諷界面 - 從來沒有打嘲笑的方法

private Mock<IPayments> _mockIPayments; 

_mockIPayments.Setup(x => x.GetCreditCard(It.IsAny<GetCreditCardRequest>())).Returns(getCreditCardResponse); 

在單元測試本身中,我創建了一個最終將調用WCF服務的服務實例;

var paymentService = new PaymentService(); 

var response = paymentService.GetCardDetails(cardId); 

在PaymentService本身中,代碼;

var response = ServiceInvoker.Invoke<IPayments, GetCreditCardRequest, GetCreditCardResponse> 
          (
           "Payments", 
           request, 
           (proxy, req) => proxy.GetCreditCard(req)); 

(注意ServiceInvoker.Invoke是隻是一個包裝,以創建一個通道和處理請求)

我缺少的東西,模擬設置不應該被捕獲到GetCreditCard請求?

ETA

爲了使它更清楚一點,流程是;

單元測試 - > PaymentsService - > IPayments

+0

這不是起訂量是如何工作的。使用_mockPaymentService.Object而不是paymentService – Crowcoder

+0

@Crowcoder _mockPaymentService不是PaymentService,而是IPayments(它是WCF服務公開的合同)。我已經更新了這個例子來反映,這可能會讓你改變你的評論? – ChrisBint

+1

在這個特定的代碼中,我不知道如何使用它,但Moq不攔截所有後續調用,如一些框架(例如MS假貨)。你必須使用模擬對象,否則你會使用實際的實現。這通常與依賴注入一起完成。 – Crowcoder

回答

1

您需要在嘲笑例如某種方式傳遞給服務。

var paymentService = new PaymentService(_mockIPayments.Object); 
0

只需指定一個設置,不會讓Moq用指定的內容替換某個接口的所有實例。它只是定義了當某個Mock實例被調用時Moq會返回的內容。在你的情況下_mockIPayments

然後,您必須在您的代碼中使用該嘲諷的IPayments實例(或者在構造函數或方法中傳遞它)以實際使用它。

如果PaymentService正在創建一個IPayments對象在內部,使用嘲諷你將不得不使用像依賴注入,使您能夠從外部指定IPayments實例,因此在測試中提供一個模擬實例。

同樣:

var paymentService = new PaymentService(_mockIPayments.Object);