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

Следите за конструктором с помощью Жасмин

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 отображается в разделе Local переменных Scope, однако свойство MyWidget находится за пределами окна.

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

48
sevenstripe 28 Янв 2013 в 23:20

9 ответов

Лучший ответ

Я смог заставить StubModule работать после нескольких настроек, в частности, передавая async: false как часть Конфиг при необходимости в заглушенном модуле.

Престижность г-ну Дэвису для того, чтобы соединить это

-14
sevenstripe 13 Июн 2013 в 20:41

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

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

var stub = sinon.createStubInstance (MyConstructor)

1
AXMIM 22 Авг 2016 в 20:48

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

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

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

Чтобы прояснить ситуацию; ты звонишь

sinon.stub(window, "MyWidget");

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

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

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

9
Aurélien Gasser 15 Авг 2014 в 20:43

Я знаю, что первоначальный вопрос уже устарел, но вы пытались заглушить прототип класса?

const myStub = sinon.stub(MyClass.prototype, 'myMethodReturnsFalse').returns(true)
const myInstance = new MyClass()
expect(myInstance.myMethodReturnsFalse()).equal(true)
0
Gerardo Lima 31 Июл 2019 в 11:22

Я использовал Mockery для Mock Конструктора / Функции без каких-либо проблем.

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, как в примере выше.

Не забудьте отключить или сбросить Mockery после теста (ов)!

2
user3331119 17 Апр 2015 в 17:39

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

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

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

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

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

5
theUtherSide 12 Июл 2018 в 22:38

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

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);
17
starmer 19 Ноя 2015 в 16:48

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

1
user1978019 12 Фев 2017 в 00:52

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

1
Yiling 11 Июн 2019 в 09:36