2016-11-21 11 views
0

Я пытаюсь использовать sinon.spy(), чтобы проверить, что функция была вызвана. Эта функция называется getMarketLabel, и она возвращает marketLabel и принимает ее в функцию. Мне нужно проверить, что был вызван getMarketLabel. Я на самом деле назвать getMarketLabel в одном месте, например, так: {getMarketLabel(sel.get('market'))} код, который я до сих пор:Sinon Spy для проверки функции был вызван

describe('Check if it has been called',() => { 
    let spy; 
    beforeEach(() => { 
    spy = sinon.spy(getMarketLabel, 'marketLabel'); 
    }) 
    it('should have been called',() => { 
    expect(spy).to.be.calledWith('marketLabel'); 
    }); 
}); 

Это ошибка я получаю: TypeError: Attempted to wrap undefined property marketLabel as function

ответ

1

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

Рабочий пример:

let obj = { 
    getMarketLabel(label) { 
    ... 
    } 
} 
sinon.spy(obj, 'getMarketLabel'); 

// This would call the spy: 
obj.getMarketLabel(...); 

Этот синтаксис (что близко к тому, что вы используете) также существует:

let spy = sinon.spy(getMarketLabel); 

Однако, это вызывает только код шпиона, когда явного вызова spy() ; когда вы вызываете getMarketLabel() напрямую, код шпиона вообще не вызывается.

Кроме того, это не будет работать:

let getMarketLabel = (...) => { ... } 
let obj   = { getMarketLabel } 
sinon.spy(obj, 'getMarketLabel'); 

getMarketLabel(...); 

Потому что вы все еще зовете getMarketLabel напрямую.

+0

Пожалуйста, смотрите эту jsfiddle: https://jsfiddle.net/hv8mLwcL/ – DaveDavidson

+0

@DaveDavidson 'sinon.spy (getMarketLabel, 'marketLabel') 'недействителен:' getMarketLabel' не является объектом, а 'marketLabel' не является функцией. – robertklep

0

Это ошибка я получаю: TypeError: Attempted to wrap undefined property marketLabel as function

Вы должны требовать от helper.js в ваш тестовый файл, а затем заменить соответствующий метод на требуемом модуле и, наконец, вызов метода заменяется на шпион:

var myModule = require('helpers'); // make sure to specify the right path to the file 

describe('HistorySelection component',() => { 
    let spy; 
    beforeEach(() => { 
    spy = sinon.stub(myModule, 'getMarketLabel'); // replaces method on myModule with spy 
    }) 
    it('blah',() => { 
    myModule.getMarketLabel('input'); 
    expect(spy).to.be.calledWith('input'); 
    }); 
}); 

Вы не можете проверить, является ли шпион называется с helpers.sel('marketLabel'), как эта функция будет выполняться до проведения теста. Вы будете поэтому, написав:

expect(spy).to.be.calledWith(helpers.sel('marketLabel'));

испытывать что, что шпион вызывается с каким-либо значением, возвращаемым helpers.sel('marketLabel') (который undefined по умолчанию).


Содержание helper.js должно быть:

module.exports = { 
    getMarketLabel: function (marketLabel) { 
    return marketLabel 
    } 
} 
+0

Я не уверен, что должно быть в вспомогательном файле. В настоящее время это то, что у меня есть: https://jsfiddle.net/8q1tLhs7/ И я по-прежнему получаю ту же ошибку. – DaveDavidson

+0

@DaveDavidson: см. Обновленный ответ. Непонятно, почему вы выполняете 'return {getMarketLabel}', что является недопустимым синтаксисом. Я изменил его на 'return marketLabel'. – rabbitco

+0

Это не работает для меня.Я все равно получаю ту же ошибку. – DaveDavidson