如何使用与测试中的函数位于同一js文件中的Sinon.js来监视函数

时间:2016-11-17 17:00:06

标签: javascript node.js closures sinon spy

我在尝试窥探与我想要测试的函数在同一个javascript文件中的函数时遇到了Sinon.js的问题。此外,我断言间谍函数被调用一次。不幸的是测试失败了。有趣的是,如果间谍功能是在另一个javascript文件而不是被测试的功能,它的工作原理!

这是我的代码:

mock_test.js:



   
var sinon = require('sinon')

var one = require('./one.js')
var two = require('./two.js')

describe('Spy ', function () {

  it('Spy another 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 two = require('./two.js')

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

var another_method = function(){
  console.log('one: another 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




我在互联网上找不到任何有用的东西,我尝试了不同的东西。请帮忙,我在这里缺少什么?

干杯 诺亚

1 个答案:

答案 0 :(得分:1)

  

不幸的是,测试失败了

这是因为 mock_test.js 中的one.some_method()调用了another_method内的one.some_method()来保留 one.js的内容 mock_test.js 中强>而不是one.another_method

以示例说明

让我们将one.js重写为:

var a = 'I am exported';
var b = 'I am not exported';

function foo () {
    console.log(a);
    console.log(this.b)
}

module.exports.a=a;
module.exports.foo=foo;

和mock_test.js:

var one = require('./one');

console.log(one); // { a: 'I am exported', foo: [Function: foo] }

one.a = 'Charles';
one.b = 'Diana';

console.log(one); // { a: 'Charles', foo: [Function: foo], b: 'Diana' }

现在,如果我们调用one.foo(),它将导致:

I am exported
Diana

I am exported已记录到控制台,因为console.log(a)内的foo指向var a内的foo内的Diana内容 one.js 即可。

console.log(this.b)已记录到控制台,因为foo中的one.b指向 mock_test.js 中的var some_method = function(){ console.log('one: some method') another_method() }

那么你需要做些什么才能使它发挥作用?

您需要更改:

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

为:

 model.addAttribute ("paperless", Arrays.asList(Paperless .values()));