2010-03-25 23 views
9

Ben kabaca şöyle bir sınıf vardır:Bu asenkron yöntemle nasıl dalga geçebilirim?

Ben BeginGetStaticReferenceData o geri arama yöntemini çağırmak yapabiliyor çağrıldığında böylece benim IWebService arayüzünü taklit istiyor
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); 
    } 
    . 
    . 
    . 
} 

. Moq kullanıyorum ve bunu nasıl yapacağımı bilemiyorum. - Ben kolayca yerine MOQ kullanmaya adapte edilebilir eminim

//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); 
. 
. 

cevap

19

İşte nasıl

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

Başar, bu büyük çalıştı. Teşekkür ederim! – Charlie

+0

Bunu UdpClient için uyarlamayı denedim ve yalnızca geri aramalarınızı '=> callback = cb' -' => cb (ar) 'arasında değiştirdiysem çalıştı. Bir canavar ya da ne hack ettim emin değilim ... – Benjol

+0

Yukarıdaki için Mock sınıfı nedir? Bu sizin sınıfınız mı yoksa kullanmak için biraz referans eklemem gerekiyor mu? –

0

Bu article Rhino dalga geçer kullanarak zaman uyumsuz yöntemleri nasıl test edileceği çok iyi bir açıklama içerir: My birim test kurmak kod şöyle görünür. Hangi karşı teste şey var birkaç kamu üye eklendi nerede

[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); 
} 

Bu test biraz değiştirilmiş ViewModel varsayar:

İlgili konular