使用Jasmine拦截EventEmitters

Aye*_*azo 5 javascript jasmine

我正在构建一个node.js模块,我也希望用Jasmine测试它.

假设我的模块看起来与此类似:

var myModule = function (foo, bar) {

  // Begin a workflow
  var workflow = new (require('events').EventEmitter)();

  workflow.on('test', function () {
    var greet = greet();
    return greet;
  });

  workflow.emit('test');

};

function greet () {
  return "Hi!";
}

module.exports = {
  myModule: myModule
};
Run Code Online (Sandbox Code Playgroud)

如何使用Jasmine测试我的模块,定位我发出的所有事件?

像这样的东西:

var myModule = require('../myModule.js');    

describe('My Module test', function () {

  it('should get greet value', function () {
    myModule.on('test', function () { // "test" as I wrote in myModule
      expect(myModule.greet).toHaveBeenCalled();
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

Chr*_*ies 0

我使用 proxyquire 完成此操作: https: //github.com/thlorenz/proxyquire

在您的测试文件中:

var proxyquire =  require('proxyquire');
var mockEvents = {};
var myModule = proxyquire('../myModule.js', {
  events: mockEvents
});

describe('My Module test', function () {
  beforeEach(function() {
    mockEvents.EventEmitter = function () {};

    mockEvents.EventEmitter.prototype = {
      on: function () { },
      emit: function () { }
    };

    spyOn(mockEvents.EventEmitter.prototype, 'on');
    spyOn(mockEvents.EventEmitter.prototype, 'emit');
  });

  it('should get greet value', function () {
    myModule()
    expect(mockEvents.EventEmitter.prototype.on).toHaveBeenCalledWith('test');
    expect(mockEvents.EventEmitter.prototype.emit).toHaveBeenCalledWith('test');
  });
});
Run Code Online (Sandbox Code Playgroud)

您还可以使用间谍作为您的模拟 EventEmitter 等。