Подтвердить что ты не робот

Javascript: Mocking Constructor с использованием Sinon

Я вытаскиваю свои волосы, пытаясь понять, как издеваться над конструктором с помощью синона. У меня есть функция, которая будет создавать несколько виджетов, вызывая конструктор, который принимает несколько аргументов. Я хочу проверить, что конструктор называется правильным числом раз с правильными параметрами, но я не хочу, чтобы фактически создавать виджеты. Следующие ссылки, по-видимому, объясняют простой способ издеваться над конструктором, однако это не работает для меня:

Шпионаж на конструкторе с использованием 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 отсутствует в окне.

Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 1

Мне удалось получить StubModule, чтобы работать после нескольких настроек, в частности, переходя в async: false как часть конфигурации, когда требующих в заглубленном модуле.

Престижность г-ну Дэвису за то, что он собрал вместе

Ответ 2

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

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);

Ответ 3

С официального сайта sinonjs:

Заменяет функцию object.method заглушкой. Исходная функция может быть восстановлена ​​путем вызова объекта .method.restore(); (или stub.restore();). Исключение выдается, если свойство уже не является функцией > , чтобы избежать опечаток при методах stubbing.

это просто указывает, что функция, для которой вы хотите создать заглушку, должна быть членом объекта объекта.

Сделать все ясно; вы вызываете

sinon.stub(window, "MyWidget");

Функция MyWidget должна находиться в глобальной области действия (поскольку вы передаете окно как параметр). Однако, как вы уже сказали, эта функция находится в локальной области видимости (вероятно, в объектном литерале или пространстве имен).

В javascript каждый может иметь доступ к глобальной области видимости, но не наоборот.

Проверьте, где вы объявляете функцию MyWidget и передаете объект контейнера в качестве первого параметра в sinon.stub()

Ответ 4

Я без проблем использовал 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 после теста (ов)!

Ответ 5

Просто нашел это в документации .

Если вы хотите создать объект-заглушку MyConstructor, но не хотите, чтобы конструктор был вызван, используйте эту служебную функцию.

var stub = sinon.createStubInstance(MyConstructor)

Ответ 6

Используя Sinon 4.4.2, я смог смоделировать метод экземпляра следующим образом:

sinon.stub(MyClass.prototype, myMethod).resolves(tesObj)

Мне нужен был макет для строки, которая выглядела примерно так:

let someData = await new MyClass(token).myMethod(arg1, arg2)

Аналогичное решение, представленное здесь: создание метода класса с помощью Sinon.js

Ответ 7

Я столкнулся с этой ошибкой, ошибочно набрав sinon.stub.throws(expectedErr), а не sinon.stub().throws(expectedErr). Я делал подобные ошибки раньше и не встречал этого конкретного сообщения раньше, поэтому он бросил меня.

Ответ 8

Используйте sinon.createStubInstance(MyES6ClassName), затем, когда MyES6ClassName вызывается с new ключевым словом, возвращается заглушка экземпляра MyES6ClassName.