Макет метод класса, используя насмешки и Синон
Я учусь модульному тестированию с использованием модуля 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 ответ:
Эти библиотеки издевательств над узлами могут быть довольно громоздкими из-за кэша модулей узла, динамической природы 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(); }); });
Надеюсь, это поможет.