2017-12-13 20 views
0

, 나는 그것에 중독 비동기 수신기를 가지고 이벤트를 높이기 위해 MOQ을 사용하려고 비동기 이벤트 리스너에 대한 인상을 true로 결과가 설정되었지만 목록에 항목을 추가하는 중입니다.이 작업을 수행하는 데 시간이 오래 걸릴 수 있으므로 새로운 작업에서이 작업을 수행하고 있습니다. 내 테스트에서, 다음은이 해봐요 실행을 위해 대기하지 않는 한, 실패MOQ WPF에서

내 시험 :

[Test] 
public void Test() 
{ 
//Arrange 
var serviceMock = new Mock<IService>(); 
var systemUnderTest = new Provider(serviceMock .Object); 

//Act 
serviceMock.Raise(mock => mock.OnResultsChanged += null); 

//Assert 
Assert.IsTrue(systemUnderTest.HasResults); 
} 

내 이벤트 리스너의 실행을 기다리고 mock.raise을 말할 수 있습니까?

감사합니다.

+0

[단위 테스팅 기다리고 있습니다 비동기 보이드 메소드 호출 (가능 중복 https://stackoverflow.com/questions/14205590/await-a-async-void-method-call-for-unit-testing) – Backs

+0

@ Nkosi, 내가 얻는 문제는 ChageResults가 기다리지 않는 내부에서 기다리고 있다는 것입니다. 아마도 단순화 된 예제에서 이것은 명확하지 않지만 대기 시간 내에 조금 더 오래 걸리면 실행이 기다리지 않고 어설 션이 실패합니다. –

답변

0

비동기로 테스트를 변환하고 지연된 작업을 기다려 비동기 이벤트 처리기에서 해당 기능을 수행 할 수 있습니다.

예를 들어 다음 테스트에서는 짝수 핸들러에서 지연을 사용하여 잠재적으로 장기 실행되는 작업을 시뮬레이트합니다.

테스트를 비동기로 변환하고 발생 된 이벤트를 기다리면 어설 션을 주장 할 수있었습니다.

public interface IService { 
    event EventHandler OnResultsChanged; 
} 

public class Provider { 
    private IService _service; 
    public Provider(IService service) { 
     _service = service; 
     _service.OnResultsChanged += ChangeResults; 
    } 

    private async void ChangeResults(object sender, EventArgs e) { 
     await Task.Delay(200); //<-- simulate delay 
     await Task.Run(() => HasResults = true); 
    } 

    public bool HasResults { get; set; } 
} 

[TestClass] 
public class MyTestClass { 
    [TestMethod] 
    public async Task Test() { 
     //Arrange 
     var serviceMock = new Mock<IService>(); 
     var systemUnderTest = new Provider(serviceMock.Object) { 
      HasResults = false 
     }; 

     //Act 
     serviceMock.Raise(mock => mock.OnResultsChanged += null, EventArgs.Empty); 

     await Task.Delay(300); //<--wait 

     //Assert 
     Assert.IsTrue(systemUnderTest.HasResults); 
    } 
} 
+0

감사! 이 기능이 작동해야합니다. Moq에 뭔가를 들어서 기다리도록 할 시간이있을 때 좀 더 조사 할 것이지만, 지금은 확실히 할 것입니다. –