Макет метод класса, используя насмешки и Синон


Я учусь модульному тестированию с использованием модуля Node mockery с sinon.

, используя только глумление и обычного класса я смогла успешно внедрить макет. Однако я хотел бы ввести заглушку Синона вместо простого класса, но у меня много проблем с этим.

Класс, над которым я пытаюсь издеваться:

function LdapAuth(options) {}

// The function that I want to mock.
LdapAuth.prototype.authenticate = function (username, password, callback) {}

А вот код, который я сейчас использую в своей функции beforeEach ():

    beforeEach(function() {
        ldapAuthMock = sinon.stub(LdapAuth.prototype, "authenticate", function(username, password, callback) {});
        mockery.registerMock('ldapauth-fork', ldapAuthMock);
        mockery.enable();
    });

    afterEach(function () {
        ldapAuthMock.restore();
        mockery.disable();
    });

Я пытался издеваться/заглушать класс LdapAuth различными способами без успех и приведенный выше код - это просто последняя версия, которая не работает.

Поэтому я просто хочу знать, как успешно издеваться над этим, используя Синон и издевательство.
1 6

1 ответ:

Эти библиотеки издевательств над узлами могут быть довольно громоздкими из-за кэша модулей узла, динамической природы Javascript и его прототипического наследования.

К счастью, Sinon также заботится об изменении объекта, который вы пытаетесь подделать, а также предоставляет хороший API для создания spys, Sub и mocks.

Вот небольшой пример того, как я бы заглушил Метод authenticate:

// ldap-auth.js

function LdapAuth(options) {
}

LdapAuth.prototype.authenticate = function (username, password, callback) {
  callback(null, 'original');
}

module.exports = LdapAuth;
// test.js

var sinon = require('sinon');
var assert = require('assert');
var LdapAuth = require('./ldap-auth');

describe('LdapAuth#authenticate(..)', function () {
  beforeEach(function() {
    this.authenticateStub = sinon
                              // Replace the authenticate function
                              .stub(LdapAuth.prototype, 'authenticate')
                              // Make it invoke the callback with (null, 'stub')
                              .yields(null, 'stub');
  });

  it('should invoke the stubbed function', function (done) {
    var ldap = new LdapAuth();
    ldap.authenticate('user', 'pass', function (error, value) {
      assert.ifError(error);
      // Make sure the "returned" value is from our stub function
      assert.equal(value, 'stub');
      // Call done because we are testing an asynchronous function
      done();
    });
    // You can also use some of Sinon's functions to verify that the stub was in fact invoked
    assert(this.authenticateStub.calledWith('user', 'pass'));
  });

  afterEach(function () {
    this.authenticateStub.restore();
  });
});

Надеюсь, это поможет.