4

I'm having problems testing a Store in flux, wanting to stub out the dispatcher. I've seen how it's done with jest, but I Want to achieve the same with sinon.

Here's what I have

Source

lib/Dispatcher. Full code here

var invariant = require('./invariant');

//...

function Dispatcher() {
  this.$Dispatcher_callbacks = {};
}

Dispatcher.prototype.register=function(callback) {
  var id = _prefix + _lastID++;
  this.$Dispatcher_callbacks[id] = callback;
  return id;
};


// ...

module.exports = Dispatcher;

Dispatcher:

module.exports.Dispatcher = require('./lib/Dispatcher')

AppDispatcher:

var Dispatcher = require('flux').Dispatcher;
var copyProperties = require('react/lib/copyProperties');
var AppDispatcher = copyProperties(new Dispatcher(), {

  handleViewAction: function(action) {
    this.dispatch({
      source: 'VIEW_ACTION',
      action: action
    });
  }

});

module.exports = AppDispatcher;

ItemStore, the one I want to test

var AppDispatcher = require('../dispatcher/AppDispatcher');
var EventEmitter = require('events').EventEmitter;
var ItemConstants = require('../constants/ItemConstants');
var merge = require('react/lib/merge');

var CHANGE_EVENT = 'change';

var _items = [];

var ItemStore = merge(EventEmitter.prototype, {

  getSoekeresultat: function() {
    return _items;
  },

  emitChange: function() {
    this.emit(CHANGE_EVENT);
  }
});

AppDispatcher.register(function(payload) {
  var action = payload.action;

  switch(action.actionType) {
    case ItemConstants.ITEMS_FETCHED:
      _items = action.payload;
      ItemStore.emitChange();
      break;
    default:
  }

  return true; // No errors.  Needed by promise in Dispatcher.
});

module.exports = ItemStore;

So what I want to stub is AppDispatcher.register. How do I do that?

I've tried doing it several ways, the last I tried was this:

var sinon = require("sinon");
require("jasmine-sinon");

describe("ItemStore", function(){
  var AppDispatcher = require('js/dispatcher/AppDispatcher.js');
  sinon.stub(AppDispatcher, 'register', function () {
    console.log("stub");
  });
  it("should use stub when called directly", function(){
    AppDispatcher.register(function (payload) {
    });
    //outputs "stub"
  });
  it("should use stub when requiring itemstore", function(){
    var ItemStore = require('js/stores/ItemStore.js');
  // doesn't output "stub"
  });

});

Can someone tell me how to stub it?

andersem
  • 724
  • 1
  • 8
  • 19

1 Answers1

0

Although it's not strictly answering your question, you can achieve what you're trying to using proxyquire. It'll allow you to stub the AppDispatcher that is required inside ItemStore. e.g.

var proxyquire = require('proxyquire');
var AppDispatcher = require('js/dispatcher/AppDispatcher.js');
var StubbedAppDispatcher = sinon.stub(AppDispatcher)

/*
 * This will load the `ItemStore` module, satisfying it's `AppDispatcher`
 * dependency (the `require('../dispatcher/AppDispatcher')` statement)
 * with our stubbed version.
 */
var ItemStore = proxyquire('js/stores/ItemStore.js', {
  '../dispatcher/AppDispatcher': StubbedAppDispatcher
});
philipisapain
  • 886
  • 9
  • 13