#javascript #testing #mocha.js #sinon #chai
#javascript #тестирование #mocha.js #sinon #чай
Вопрос:
У меня есть метод, который проверяет, определена или нет глобальная функция (она может быть доступна, зависит от запроса каждого клиента). Если она определена, она вызовет ее с соответствующими данными. В противном случае произойдет молчаливый сбой. Это желаемое поведение.
Что я хочу сделать, так это протестировать это. Есть ли способ издеваться и / или шпионить libFunction
, чтобы я мог убедиться, что она вызывается один раз с правильными данными (функция здесь очень упрощена, по пути происходит некоторая обработка данных).
Вот метод, о котором идет речь:
function sendData(data) {
let exists;
try {
// eslint-disable-next-line no-undef
if (libFunction) exists = true;
} catch (e) {
exists = false;
}
if (exists) {
// eslint-disable-next-line no-undef
libFunction(data);
}
}
Я пытался определить libFunction
в своих тестах, а затем заглушить это, но это не дает того, что я хочу:
describe('sendEvent', function () {
function libFunction(data) {
console.log('hi', data);
}
it('should call libFunction once', function () {
var stub = sinon.stub(libFunction);
var data = "testing";
sendEvent(data);
expect(stub.called).to.be.true;
});
});
Однако этот тест не пройден: AssertionError: expected undefined to be true
Я пробовал нечто подобное со шпионом:
describe('sendEvent', function () {
function libFunction(data) {
console.log('hi', data);
}
it('should call libFunction once', function () {
var spy = sinon.spy(libFunction);
var data = "testing";
sendEvent(data);
expect(spy.called).to.be.true;
});
});
Это также не удается: AssertionError: expected false to be true
Есть ли способ сделать это?
Комментарии:
1. Вы, вероятно, хотите
sinon.spy(window, 'libFunction')
, чтобы то, что вы делаете, создавало программу-шпион, поддерживаемую тем, чтоlibFunction
не шпионитlibFunction
.2. окно не определено, поскольку я не имитирую браузер в своей тестовой среде. есть ли другой способ сделать это?
3. Вы могли бы попробовать
global
вместоwindow
.
Ответ №1:
Черт возьми, я наткнулся на этот вопрос, пытаясь решить проблему с заглушкой глобального метода в Node. В моем случае это сработало (в моем примере используется Sinon.sandbox
, но «обычный» Sinon.spy
тоже должен работать):
const encodeSpy = sandbox.spy(global, "encodeURIComponent");
// later...
Sinon.assert.calledWith(encodeSpy, {expectedParamValue});