Mocha:事件发生后如何断言?

Mocha: How to assert after an event?

我正在与 Electron 和 Johnny-Five 合作处理我用 Arduino Mega 2560 读取的一些数据,但我在测试 Arduino 的连接时遇到了一些问题。

这是我要测试的方法(忽略糟糕的签名):

export let board: Board | null = null;

export function setArduinoBoard(f: (num: number, ...etc: any[]) => void, num: number, ...etc: any[]) {
    if (board == null)
        board = new Board({...});

    board = board.on("ready", () => f(num, etc));
}

这是我的测试:


describe.only("setArduinoBoard()", function() {
    it("can communicate with the Arduino device", function(done) {
        const f = (num: number) => console.log(num);
        const spy = sinon.spy(f);
        setArduinoBoard(f, 0);
        assert(spy.called);
        done();
    });
});

我想要的是让断言等到函数被调用。我知道它最终会被调用,因为控制台输出 0 但它只是在断言失败之后才被调用。

典型的方法是将 done 回调移动到事件处理程序中。这样,测试将等待回调被调用。如果未触发 ready 事件,则不会调用回调,测试将在 2 秒后超时并出现错误。

这意味着您不需要显式断言事件 f 被调用,事实上,您不需要监视它。

    it("can communicate with the Arduino device", function(done) {
        const f = (num: number) => {
            console.log(num);
            done();
        };
        setArduinoBoard(f, 0);
    });

如果您需要在 ready 事件触发后断言某些内容,您可以在事件处理程序中添加断言并使用 catch 块捕获异常并将它们传递给 done 回调。

    it("can communicate with the Arduino device", function(done) {
        const f = (num: number) => {
            try {
                assert.equal(num, 0);
                done();
                return;
            } catch (err) {
                done(err);
            }
        };
        setArduinoBoard(f, 0);
    });