![](/img/trans.png)
[英]Is it safe to call BeginXXX without calling EndXXX if the instance is already disposed
[英]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.