2010-03-25 5 views
9

나는 대략 다음과 같습니다 클래스가 있습니다어떻게이 비동기 메서드를 조롱 할 수 있습니까?

나는 BeginGetStaticReferenceData이 콜백 메소드를 호출 할 수 호출 할 때 수 있도록 내 IWebService 인터페이스를 조롱 할
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을 사용하고 있으며 이것을 어떻게 할 수 없어요. - 내가 쉽게 대신 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에 적용하려고 시도했다. 콜백을'=> callback = cb'에서'=> cb (ar)'로 바꾼 경우에만 작동했다. 괴물을 해킹했는지 확실하지 않습니다 ... – Benjol

+0

위의 모의 수업은 무엇입니까? 수업이 아니니 사용하기 위해 참고 자료를 추가해야하나요? –

0

article는 코뿔소 모의 객체를 사용하여 비동기 방법을 테스트하는 방법에 대한 매우 좋은 설명이 포함되어 내 단위 테스트 설정 코드가 같이 보입니다. 내가있는 테스트 할 일이 몇 public 멤버를 추가 곳

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

이 테스트는 약간 수정 된 뷰 모델을 가정합니다 :

관련 문제