2017-04-22 2 views
0

안녕하세요, NUnit을 사용하여 이벤트를 테스트하는 중에 문제가 있습니다. 이것이 단위 테스트인지 기능 테스트인지 확실하지 않습니다. (나는 OnValueInjected 이벤트를 테스트하기 위해 노력하고있어) 내가 먼저 당신에게 샘플 클래스를 보여 드리죠 :단위 테스트 중 이벤트를 잡는 방법?

그래서
public class Foo 
{ 
    private IBar CurrentBar { get; set; } 
    public event EventHandler<MoveEventArgs> OnValueInjected; 

    public Foo() 
    { 
     StartFoo(); 
    }  

    private async void StartFoo() 
    { 
     await Task.Factory.StartNew(() => 
     { 
      while (State != FooState.Finished) 
      { 
       IResult result = CurrentBar.WaitForValue(); // This is blocking function, wait for a value 

       OnValueInjected?.Invoke(this, new ResultEventArgs(result)); 

       // .. rest of the loop 
      } 
     }); 
    } 

    public void InjectValue(int a, int b) 
    { 
     CurrentBar.Inject(a,b); 
    } 
} 

, 기본적으로 내가 할 노력하고있어하는 이벤트에 가입 InjectValue를 호출하고 이벤트 있는지 확인하는 것입니다 라고 불렀다. 이처럼 : InjectValue가 너무 느립니다처럼

[Test] 
    public void FooOnValueInjectedTest() 
    { 
     bool OnValueInjectedWasRasied = false; 

     IFoo foo = new Foo(); 
     foo.OnValueInjected += (s, e) => OnValueInjectedWasRasied = true; 

     foo.InjectValue(0,0); 

     Assert.AreEqual(true, OnValueInjectedWasRasied); 
    } 

매우 간단하지만 보인다. 테스트가 실패했습니다. 너무 느리다 고 생각합니다. 을 InjectValueAssert 사이에 추가하면 작동합니다.

 foo.InjectValue(0,0); 
     Thread.Sleep(1000); 
     Assert.AreEqual(true, OnValueInjectedWasRasied); 

이러한 이벤트를 테스트하는 더 좋은 방법이 있습니까? 감사합니다

나는 내 수업을 고정, 그래서 지금처럼 :

public class Foo 
{ 
    private AutoResetEvent AutoReset { get; } 

    private IBar CurrentBar { get; set; } 
    public event EventHandler<MoveEventArgs> OnValueInjected; 

    public Foo() 
    { 
     AutoReset = new AutoResetEvent(false); 
     StartFoo(); 
    } 

    private async void StartFoo() 
    { 
     await Task.Factory.StartNew(() => 
     { 
      while (State != FooState.Finished) 
      { 
       IResult result = CurrentBar.WaitForValue(); // This is blocking function, wait for a value 

       OnValueInjected?.Invoke(this, new ResultEventArgs(result)); 

       AutoReset.Set(); 

       // .. rest of the loop 
      } 
     }); 
    } 

    public void InjectValue(int a, int b) 
    { 
     if (CurrentBar.Inject(a,b)) 
     { 
      AutoReset.WaitOne(); 
     } 
    } 
} 
+2

글쎄, 당신은 * 원하는 않는 ACT에서 테스트 방법 그리고

public class Foo { private AutoResetEvent AutoReset { get; } private IBar CurrentBar { get; set; } public event EventHandler<MoveEventArgs> OnValueInjected; public Foo() { AutoReset = new AutoResetEvent(false); StartFoo(); } private async void StartFoo() { await Task.Factory.StartNew(() => { while (State != FooState.Finished) { IResult result = CurrentBar.WaitForValue(); // This is blocking function, wait for a value OnValueInjected?.Invoke(this, new ResultEventArgs(result)); AutoReset.Set(); // .. rest of the loop } }); } public async void InjectValue(int a, int b) { if (CurrentBar.Inject(a,b)) { AutoReset.WaitOne(); } } } 

당신이 * 당신의'이벤트 핸들러가 확실히 제기되기 전에 InjectValue'이 돌아갑니다? 기본적으로 비동기의 자연스러운 결과를보고 있습니다 ... 이벤트가 아니라 비동기 실행입니다. –

+0

@JonSkeet 음 .. 기술적으로'OnValueInjected'가 제기 될 때까지'InjectValue'가 차단 될 수 있다고 말하는 겁니까? 나는 실제로 그것에 대해 생각하지 않았습니다. –

+0

당신이 * 그 행동을 원한다면, 당신은 그것을 확신 할 수 있습니다, 그렇습니다. 당신이하든하지 않든간에 다른 문제입니다. –

답변

0

나는이 비동기 호출의 문제 믿습니다. NUnit 테스트에서 비동기 메소드가있을 때마다 아무도 실제로 그것을 기다리지 않고 결과를 리턴하지 않으므로 기다리지 않습니다. 대신 비동기 메소드에서 .Wait을 수행하여 테스트가 완료 될 때까지 기다려야합니다.

코드 편집기에이 코드를 작성하지 않았으므로 완벽하지는 않지만 기본적인 생각입니다. .Wait

[Test] 
public void FooOnValueInjectedTest() 
{ 
    // Arrange 
    bool OnValueInjectedWasRasied = false; 

    IFoo foo = new Foo(); 
    foo.OnValueInjected += (s, e) => OnValueInjectedWasRasied = true; 

    // Act 
    foo.InjectValue(0,0).Wait(); 

    // Assert 
    Assert.AreEqual(true, OnValueInjectedWasRasied); 
} 
+0

제안에 감사하지만'foo.InjectValue (0,0);'함수는 기다릴 수 없습니다. 있을 필요는 없습니다. 차단 컬렉션에 값을 주입해야합니다. 컬렉션이 채워지면 컬렉션이 릴리스됩니다. 매우 실제적인 시나리오입니다. 그래서 코드를 변경하지 않고 테스트하는 방법을 궁금합니다. 나는 그것을 시험해야 하는가? –

+0

필자는이 메소드를 잘못 이해 했어야하며 Inject 메소드가 다른 비동기 메소드를 호출하고 있다고 생각했습니다. 내 잘못이야. 테스트해야합니까? 그것은 "당신은 무엇을 시험하려고합니까?"라는 질문에 대한 대답에 달려 있습니다. 거기에서 시험 할만한 것이 많이있는 것 같지 않습니다. – AzzamAziz