javascript - How to spy a function with Sinon.js that is in the same js file as the function under test -


i have problem sinon.js while trying spy function in same javascript file function want test. furthermore assert spied function called once. unfortunately test fails. interesting thing is, if spied function in javascript file function under test works !

here code:

mock_test.js:

     var sinon = require('sinon')    var 1 = require('./one.js')  var 2 = require('./two.js')    describe('spy ', function () {      it('spy method', sinon.test(function (done) {      var another_method_spy = sinon.spy(one, 'another_method')        one.some_method()      sinon.assert.calledonce(another_method_spy)      done()    }))      it('spy second method', sinon.test(function (done) {      var second_method = sinon.spy(two, 'second')        one.call_second()      sinon.assert.calledonce(second_method)      done()    }))    })

one.js:

var 2 = require('./two.js')    var some_method = function(){    console.log('one: method')    another_method()  }    var another_method = function(){    console.log('one: method')  }    var call_second = function(){    console.log('one: call second')    two.second()  }    module.exports.some_method = some_method  module.exports.another_method = another_method  module.exports.call_second = call_second

two.js:

var second = function(){    console.log('two: second')  }    module.exports.second = second

i couldn't find helpful in internet , tried different things. please help, missing here ?

cheers noah

unfortunately test fails

that because one.some_method() in mock_test.js invokes another_method inside closure one.some_method() holding on content of one.js , not one.another_method in mock_test.js.

illustration example

lets re-write one.js to:

var = 'i exported'; var b = 'i not exported';  function foo () {     console.log(a);     console.log(this.b) }  module.exports.a=a; module.exports.foo=foo; 

and mock_test.js to:

var 1 = require('./one');  console.log(one); // { a: 'i exported', foo: [function: foo] }  one.a = 'charles'; one.b = 'diana';  console.log(one); // { a: 'charles', foo: [function: foo], b: 'diana' } 

now if invoke one.foo() result in:

i exported diana 

the i exported logged console because console.log(a) inside foo points var a inside closure foo holding on contents of one.js.

the diana logged console because console.log(this.b) inside foo points one.b in mock_test.js.

so need make work?

you need change:

var some_method = function(){   console.log('one: method')   another_method() } 

to:

var some_method = function(){   console.log('one: method')   this.another_method() } 

Comments

Popular posts from this blog

account - Script error login visual studio DefaultLogin_PCore.js -

xcode - CocoaPod Storyboard error: -