簡體   English   中英

如何使用moq設置BeginXXX EndXXX方法調用?

[英]How to setup a BeginXXX EndXXX method call with moq?

假設我有一些APM(BeginXxx,EndXxx)模式異步方法(作為我正在調用的一些WCF服務代理的一部分):

public interface ISomeService
{
    IAsyncResult BeginSomeMethod(int num, AsyncCallback callback, object state);
    int EndSomeMethod(IAsyncResult ar);
}

我的實際代碼使用Task.Factory.FromAsync來創建一個Task,然后使用.net 4.5中引入的新的async / await模式等待這個任務。

我想測試我的類,因此我需要編寫一個接收mock,begin方法,end方法和返回值的方法,並設置mock以便最終返回所需的返回值。

示例用法:

SetupAsync(mock, mocked => mocked.BeginSomeMethod, mocked=> mocked.EndSomeMethod, 7);

這將導致異步流與任何int參數返回7.我似乎無法弄清楚如何在moq中完成這樣的事情。

首先,我建議您使用TaskWsdlImportExtension創建基於Task的異步WCF代理。 VS2012默認執行此操作,但您必須自己在VS2010 + AsyncCTP上進行設置 針對Task API進行單元測試更容易。

如果你想對Begin / End進行單元測試,我認為最簡單的方法是使用基於Task的模擬並公開Begin / End端點。 我的AsyncEx庫中的[AsyncFactory|AsyncFactory<T>].[ToBegin|ToEnd]方法提供了圍繞Task Begin / End方法包裝,或者你可以看到Stephen Toub關於編寫這些包裝器的博客文章

您可以從Task.FromResult獲取簡單的已完成任務,也可以使用以下構造來強制執行異步完成的任務:

Task.Run(async () => { await Task.Yield(); return 7; });

(異步CTP等價物將是):

TaskEx.RunEx(async () => { await TaskEx.Yield(); return 7; });

我不完全確定如何將其與Moq聯系起來。 同樣,我懷疑基於Task的API比Begin / End更容易模擬。 Begin / End有自己的特殊語義(你必須傳遞正確的IAsyncResult ,每個Begin必須調用一次End ,等等),所以還有更多東西要測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM