如何使用 Sinon.js 监视与被测函数位于同一 js 文件中的函数
How to spy a function with Sinon.js that is in the same js file as the function under test
我在尝试监视与我要测试的函数位于同一 javascript 文件中的函数时遇到 Sinon.js 问题。此外,我断言 spied 函数被调用了一次。不幸的是,测试失败了。有趣的是,如果间谍函数在另一个 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
我在互联网上找不到任何有用的东西,而且我尝试了不同的东西。请帮忙,我在这里缺少什么?
干杯
诺亚
Unfortunately the test fails
这是因为 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
被记录到控制台,因为 foo
内的 console.log(a)
指向闭包内的 var a
foo
保留了 one.js。
Diana
被记录到控制台,因为 foo
中的 console.log(this.b)
指向 mock_test.js[=55= 中的 one.b
].
那么你需要做什么才能让它发挥作用?
您需要更改:
var some_method = function(){
console.log('one: some method')
another_method()
}
至:
var some_method = function(){
console.log('one: some method')
this.another_method()
}
我在尝试监视与我要测试的函数位于同一 javascript 文件中的函数时遇到 Sinon.js 问题。此外,我断言 spied 函数被调用了一次。不幸的是,测试失败了。有趣的是,如果间谍函数在另一个 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
我在互联网上找不到任何有用的东西,而且我尝试了不同的东西。请帮忙,我在这里缺少什么?
干杯 诺亚
Unfortunately the test fails
这是因为 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
被记录到控制台,因为 foo
内的 console.log(a)
指向闭包内的 var a
foo
保留了 one.js。
Diana
被记录到控制台,因为 foo
中的 console.log(this.b)
指向 mock_test.js[=55= 中的 one.b
].
那么你需要做什么才能让它发挥作用?
您需要更改:
var some_method = function(){
console.log('one: some method')
another_method()
}
至:
var some_method = function(){
console.log('one: some method')
this.another_method()
}