samedi 22 avril 2017

How to catch event while unit testing?

Hi I have a problem testing an event using NUnit. I'm not even sure if this should be unit or functional test. Let me show you the sample class first (I'm trying to test OnValueInjected event):

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

So, basically what I'm trying to do is to subscribe to the event, call InjectValue and check if the event was called. Like this:

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

Pretty straightforward, BUT it looks like InjectValue is too slow. The test is failing..I think it's too slow, because when I add Thread.Sleep between InjectValue and Assert to works.

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

Is there a better way to test such an event? Thanks

Aucun commentaire:

Enregistrer un commentaire