Add some variable to the test case: bool finished;
Set the variable in the callback: finished = true;
Add something like

    assertWithTimeout({return finished;});

at the end of the test case, following ev.run;

Does it help?

On Wednesday, 29 August 2012 at 19:20:25 UTC, Shripad K wrote:
How do I test callbacks/delegates which are not triggered immediately? Especially when I need to do unit tests with an event loop? A simple example from my codebase (SaaSy here is a custom HTTP client to an API endpoint):

class TestSaaSy {
    mixin TestMixin;

    // this works
    void test_encoded_auth() {
        auto ev = new EventLoop;
        auto saasy = new SaaSy(ev, "test", "test");
assert(saasy.encoded_auth == "dGVzdDp0ZXN0dGVzdA==", "encoding issue");
        ev.close;
        ev.run;
    }

// won't work. test gets finished even before the callback is fired!
    void test_get_subscription() {
        auto ev = new EventLoop;
        auto saasy = new SaaSy(ev, "test", "test");
saasy.getSubscription("ref363466", (bool err, string response) {
            assert(err == true);
            ev.close;
        });
        ev.run;
    }
}

Reply via email to