node.js - Node - 如何测试 stub 依赖项的匿名回调

标签 node.js jasmine raspberry-pi stubbing

我正在编写一个 Nodejs 模块来抽象连接到 Raspberry Pi 的 gpio 接头的驱动电机的细节。
我用来与 pi 的 gpio 通信的 Node 模块是 pi-gpio

我正在使用 jasmine 测试我的模块,并且因为我知道我需要pi-gpio 模块具有特定的硬件要求,并且它不会在我的开发 PC 上运行(因为它不是 pi),所以我使用 proxyquire stub 依赖关系。

考虑以下(简化的)模块:
nodepibot.js

'use strict';

var gpio = require("pi-gpio");

const LOW = 0,
    HIGH = 1;

const MOTOR_LEFT_ENABLE = 22,
    MOTOR_LEFT_A = 16,
    MOTOR_LEFT_B = 18;

var leftMotorStop = function leftMotorStop() {
    gpio.write(MOTOR_LEFT_ENABLE, LOW, function (err) {
        if (err) {
            throw err;
        }
    });
};

module.exports = {
    "leftMotorStop": leftMotorStop
};

还有我的 jasmine 规范:
nodepibotSpec.js

describe("Node Pibot tests", function() {

    var nodepibot,
        stubGpio = {
            write: function() {}
        };

    beforeEach(function() {
        var proxyquire = require('proxyquire').noCallThru();
        nodepibot = proxyquire("../main/nodepibot", {'pi-gpio': stubGpio});
    });

    it("Should stop left motor", function() {
        // Given
        spyOn(stubGpio, "write");

        // When
        nodepibot.leftMotorStop();

        // Then
        expect(stubGpio.write.callCount).toBe(1);
        expect(stubGpio.write).toHaveBeenCalledWith(22, 0, jasmine.any(Function));
    });

});

上面测试了我的“快乐之路”——IE。我断言,当在我的模块上调用 leftMotorStop 时,会使用适当的参数在 pi-gpio 库上调用 write 方法。

我想做的是测试un-happy path - IE。当 err 有值时测试匿名回调函数,在这种情况下我断言会抛出异常。

有人知道我该怎么做吗?

最佳答案

只需重写 stub 写入函数,即可调用错误函数:

var nodepibot,
    stubGpio = {
        write: function(var1, var2, callback) {
            callback("stubbed error");
        }
    };

关于node.js - Node - 如何测试 stub 依赖项的匿名回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35509601/

相关文章:

raspberry-pi - xrdp - 自动加入 session

camera - 运行 RPi-Cam-Web-Interface

javascript - 获取/监听 channel 中的新消息

node.js - 确保 forEach 循环在下一个命令 js 之前完成

angularjs - 如何在 Protractor 中使用 Jasmine 和 CucumberJS

javascript - 如何测试嵌套 promise 的 Angular 服务功能?

python - 为什么在 Python Shell 中使用 Telnet 时出现此错误消息

node.js - npm install -g expo-cli 失败,显示 "EPERM: operation not permitted, unlink ' ...\adb.exe'

html - Node.js Web 应用程序中的 ECONNRESET、MongoNetworkError

javascript - 在 "it" block 之外运行代码会破坏我的 Jasmine 测试