4

node.js アプリケーションをモックしようとしていますが、期待どおりに動作しません。

次の方法で GpioPlugin という node.js モジュールがあります。

function listenEvents(eventId, opts) {
   if(!opts.pin) {
      throw new Error("option 'pin' is missing");
   }
   var listenPort = new onOff(opts.pin, 'in', 'both', {persistentWatch: true});

   listenPort.watch(function(err, value) {
      process.emit(eventId+'', value);
   });
}
if(typeof exports !== 'undefined') {
    exports.listenEvents = listenEvents;
}

そして今、このメソッドに sinon を使用してテストを書きたいのですが、方法がわかりません...これをテストする最良の方法は何ですか?

このツリー部分は、テストされれば問題ありません: エラー (問題なし) onOff の生成 (どのように?) 正しいパラメータを持つイベント

4

1 に答える 1

0

onOffまだない場合は、テストでスタブを挿入できるようにモジュールに入れたいと思うでしょう。

var sinon = require("sinon");
var process = require("process");
var onOffModule = require(PATH_TO_ONOFF);  //See note
var gpio = require(PATH_TO_GPIO);

var onOffStub;
var fakeListenPort;

beforeEach(function () {
    //Stub the process.emit method
    sinon.stub(process, "emit");

    //Constructor for a mock object to be returned by calls to our stubbed onOff function
    fakeListenPort = {
        this.watch = function(callback) {
            this.callback = callback; //Expose the callback passed into the watch function
        };
    };

    //Create stub for our onOff;
    onOffStub = sinon.stub(onOffModule, "onOff", function () {
        return fakeListenPort;
    });
});

//Omitted restoring the stubs after each test

describe('the GpioPlugin module', function () {
    it('example test', function () {
        gpio.listenEvents("evtId", OPTS);

        assert(onOffStub.callCount === 1); //Make sure the stub was called
        //You can check that it was called with proper arguments here

        fakeListenPort.callback(null, "Value"); //Trigger the callback passed to listenPort.watch

        assert(process.emit.calledWith("evtId", "Value")); //Check that process.emit was called with the right values
    });
});

注: onOff をスタブに置き換える正確なメカニズムは、必要に応じて異なる場合があります。

onOffを含むモジュールを要求するのではなく、直接要求する場合、状況はもう少し複雑になりますonOff。その場合、proxyquireのようなものを調べる必要があるかもしれません。

于 2014-05-20T02:13:07.493 に答える