Ответ 1
Мне удалось получить StubModule, чтобы работать после нескольких настроек, в частности, переходя в async: false как часть конфигурации, когда требующих в заглубленном модуле.
Престижность г-ну Дэвису за то, что он собрал вместе
Я вытаскиваю свои волосы, пытаясь понять, как издеваться над конструктором с помощью синона. У меня есть функция, которая будет создавать несколько виджетов, вызывая конструктор, который принимает несколько аргументов. Я хочу проверить, что конструктор называется правильным числом раз с правильными параметрами, но я не хочу, чтобы фактически создавать виджеты. Следующие ссылки, по-видимому, объясняют простой способ издеваться над конструктором, однако это не работает для меня:
Шпионаж на конструкторе с использованием Jasmine
http://tinnedfruit.com/2011/03/25/testing-backbone-apps-with-jasmine-sinon-2.html
Когда я делаю следующий вызов, чтобы заглушить конструктор:
sinon.stub(window, "MyWidget");
Я получаю следующую ошибку:
Uncaught TypeError: Attempted to wrap undefined property MyWidget as function
При отладке в Chrome я вижу, что MyWidget отображается в локальном разделе переменных области, однако свойство MyWidget отсутствует в окне.
Любая помощь будет принята с благодарностью.
Мне удалось получить StubModule, чтобы работать после нескольких настроек, в частности, переходя в async: false как часть конфигурации, когда требующих в заглубленном модуле.
Престижность г-ну Дэвису за то, что он собрал вместе
Мне нужно решение для этого, потому что мой код вызывал новый оператор. Я хотел высмеять объект, созданный новым вызовом.
var MockExample = sinon.stub();
MockExample.prototype.test = sinon.stub().returns("42");
var example = new MockExample();
console.log("example: " + example.test()); // outputs 42
Затем я использовал rewire, чтобы ввести его в код, который я тестировал
rewiredModule = rewire('/path/to/module.js');
rewiredModule.__set__("Example", example);
С официального сайта sinonjs:
Заменяет функцию object.method заглушкой. Исходная функция может быть восстановлена путем вызова объекта .method.restore(); (или stub.restore();). Исключение выдается, если свойство уже не является функцией > , чтобы избежать опечаток при методах stubbing.
это просто указывает, что функция, для которой вы хотите создать заглушку, должна быть членом объекта объекта.
Сделать все ясно; вы вызываете
sinon.stub(window, "MyWidget");
Функция MyWidget должна находиться в глобальной области действия (поскольку вы передаете окно как параметр). Однако, как вы уже сказали, эта функция находится в локальной области видимости (вероятно, в объектном литерале или пространстве имен).
В javascript каждый может иметь доступ к глобальной области видимости, но не наоборот.
Проверьте, где вы объявляете функцию MyWidget и передаете объект контейнера в качестве первого параметра в sinon.stub()
Я без проблем использовал Mockery для создания конструктора/функции.
var mockery = require('mockery');
var sinon = require('sinon');
mockery.enable({
useCleanCache: true,
warnOnReplace: false,
warnOnUnregistered: false
});
exports.Client = function() {/* Client constructor Mock */};
var ClientSpy = sinon.spy(exports, 'Client');
mockery.registerMock('Client', ClientSpy);
var Factory = require('Factory'); // this module requires the Client module
Вы должны иметь возможность применять Sinon Spy так же, как в примере выше.
Обязательно отключите или reset Mockery после теста (ов)!
Просто нашел это в документации .
Если вы хотите создать объект-заглушку MyConstructor, но не хотите, чтобы конструктор был вызван, используйте эту служебную функцию.
var stub = sinon.createStubInstance(MyConstructor)
Используя Sinon 4.4.2, я смог смоделировать метод экземпляра следующим образом:
sinon.stub(MyClass.prototype, myMethod).resolves(tesObj)
Мне нужен был макет для строки, которая выглядела примерно так:
let someData = await new MyClass(token).myMethod(arg1, arg2)
Аналогичное решение, представленное здесь: создание метода класса с помощью Sinon.js
Я столкнулся с этой ошибкой, ошибочно набрав sinon.stub.throws(expectedErr)
, а не sinon.stub().throws(expectedErr)
. Я делал подобные ошибки раньше и не встречал этого конкретного сообщения раньше, поэтому он бросил меня.
Используйте sinon.createStubInstance(MyES6ClassName)
, затем, когда MyES6ClassName вызывается с new
ключевым словом, возвращается заглушка экземпляра MyES6ClassName.