2010-03-25 23 views
9

मैं एक वर्ग कि मोटे तौर पर इस तरह दिखता है:मैं इस एसिंक्रोनस विधि का नकल कैसे कर सकता हूं?

public class ViewModel 
{ 
    public ViewModel(IWebService service) 
    { 
    this.WebService = service; 
    } 

    private IWebService WebService{get;set;} 
    private IEnumerable<SomeData> MyData{get;set;} 

    private void GetReferenceData() 
    { 
    this.WebService.BeginGetStaticReferenceData(GetReferenceDataOnComplete, null); 
    } 

    private void GetReferenceDataOnComplete(IAsyncResult result) 
    { 
    this.MyData = this.WebService.EndGetStaticReferenceData(result); 
    } 
    . 
    . 
    . 
} 

मैं अपने IWebService इंटरफ़ेस उपहास करने के लिए इतना है कि जब BeginGetStaticReferenceData यह कॉलबैक विधि कॉल करने में सक्षम है कहा जाता है चाहता हूँ। मैं मोक का उपयोग कर रहा हूं और मैं यह नहीं कर सकता कि यह कैसे करें। - मुझे यकीन है कि यह आसानी से बजाय Moq उपयोग करने के लिए अनुकूलित किया जा सकता हूँ

//Arrange 
var service = new Mock<IWebService>(); 
service.Setup(x => x.BeginGetStaticReferenceData(/*.......don't know.....*/)); 
service.Setup(x => x.EndGetStaticReferenceData(It.IsAny<IAsyncResult>())).Returns(new List<SomeData>{new SomeData{Name="blah"}}); 
var viewModel = new ViewModel(service.Object); 
. 
. 

उत्तर

19

यहाँ है कैसे

public class ViewModel 
{ 
    public ViewModel(IWebService service) 
    { 
     this.WebService = service; 
    } 

    public IEnumerable<SomeData> MyData { get; set; } 

    public void DoIt() 
    { 
     this.GetReferenceData(); 
    } 

    private IWebService WebService { get; set; } 

    private void GetReferenceData() 
    { 
     this.WebService.BeginGetStaticReferenceData(GetReferenceDataOnComplete, null); 
    } 

    private void GetReferenceDataOnComplete(IAsyncResult result) 
    { 
     this.MyData = this.WebService.EndGetStaticReferenceData(result); 
    } 
} 
+0

बहुत बढ़िया, इस महान काम किया। धन्यवाद! – Charlie

+0

मैंने UdpClient के लिए इसे अपनाने का प्रयास किया, और यह केवल तभी काम किया जब मैंने आपकी कॉलबैक '=> कॉलबैक = सीबी' से' => सीबी (एआर) 'में बदल दी। यकीन नहीं है कि मैंने एक राक्षस हैक किया है या क्या ... – Benjol

+0

ऊपर के लिए नकली कक्षा क्या है? क्या यह आपकी कक्षा है या मुझे इसका उपयोग करने के लिए कुछ संदर्भ जोड़ने की ज़रूरत है? –

0

यह article कैसे राइनो Mocks का उपयोग कर async तरीकों का परीक्षण करने पर एक बहुत अच्छा विवरण शामिल हैं: मेरी इकाई परीक्षण कोड सेट अप की तरह दिखता है।

[TestMethod] 
public void Test10() 
{ 
    var expectedData = new[]{new SomeData(), new SomeData()}; 

    AsyncCallback callback = null; 
    IAsyncResult ar = new Mock<IAsyncResult>().Object; 

    var webServiceStub = new Mock<IWebService>(); 
    webServiceStub 
     .Setup(ws => ws.BeginGetStaticReferenceData(It.IsAny<AsyncCallback>(), null)) 
     .Callback((AsyncCallback cb, object state) => callback = cb) 
     .Returns(ar); 
    webServiceStub 
     .Setup(ws => ws.EndGetStaticReferenceData(It.IsAny<IAsyncResult>())) 
     .Returns(expectedData); 

    var sut = new ViewModel(webServiceStub.Object); 
    sut.DoIt(); 

    callback(ar); 

    Assert.AreEqual(expectedData, sut.MyData); 
} 

यह परीक्षण मान लिया गया एक थोड़ा संशोधित ViewModel जहां मैं कुछ सार्वजनिक सदस्य नहीं जोड़ा जिसके खिलाफ परीक्षण के लिए कुछ है करने के लिए:

संबंधित मुद्दे