Stubbing and/or mocking a class in sinon.js?

删除回忆录丶 提交于 2019-12-03 05:22:26
Cristiano Fontes

You can use both for that.

Mock have an expected ordered behavior that, if not followed correctly, is going to give you an error.

A Stub is a similar to a mock, but without the order, so you can call your methods the way you want. In my experience you almost never need a mock.

Both of them will substitute your method for an empty method, or a closure if you pass one. It would be something like this:

stub = sinon.stub(wrapper , 'insertUser ', function () { return true; });

Then you add the expect behavior to check if it did happened.

I like to use Jasmine with Jasmine-Sinon for checking the tests.

First, I'd modify your class definition a bit (uppercase class name and fix db assignment):

var Wrapper = (function() {

  function Wrapper() {
    this.db = require("database");
  }

  Wrapper.prototype.insertUser = function(doc) {
    return this.db.query("INSERT INTO USERS...");
  };

  return Wrapper;

})();

To stub the whole class:

var WrapperStub = sinon.spy(function() {
  return sinon.createStubInstance(Wrapper);
});

sinon.createStubInstance will create an instance of Wrapper where every method is a stub. sinon.spy will allow us to spy the class instantiation.

So you could exercise it like this:

// verify instantiation
var wrapper = new WrapperStub();
expect(WrapperStub).to.have.been.calledWithNew;

// verify method stub
wrapper.insertUser.returns('data');
expect(wrapper.insertUser()).to.equal('data');
expect(wrapper.insertUser).to.have.been.calledOnce;

(assertions use chai and sinon-chai)

I said just "exercise it" because this code snippet is not an actual unit test. Instantiation and method calls will be made by your subject under test.

Now, if you want to mock a dependency injected by require() –such as db = require('database') in your example–, you could try a testing tool like either Jest (but not using sinon) or sinonquire which I created inspired by Jest but to use it with sinon plus your favorite testing tool (mine is mocha). Internally, sinonquire uses the same technique shown above of combining sinon.spyand sinon.createStubInstance to stub a class.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!