gpt4 book ai didi

javascript - 未调用方法上的 Sinon.spy

转载 作者:行者123 更新时间:2023-11-30 00:15:45 26 4
gpt4 key购买 nike

我正在测试的代码相当简单:它会在条件得到验证时调用一个方法。如果不是,它会调用包含在第一个方法中的另一个方法作为属性。

app.js:

function test (fn, isActivated) {
if (isActivated) {
return fn('foo')
}

return fn.subFn('bar')
}

var fn = function (p) { return p }
fn.subFn = function (p) { return 'sub-' + p }

var resFn = test(fn, true)
var resSubFn = test(fn, false)

document.write(resFn) // shows 'foo' as expected
document.write(resSubFn) // shows 'bar' as expected

我在每个方法上都设置了一个 spy ,但是在 fn 方法上的 spy 似乎不起作用,而在包含的方法 subFn 上的 spy 工作。见下文:

app.test.js:

'use strict'

const chai = require('chai')
const sinon = require('sinon')
const trigger = require('../app').trigger

chai.should()

describe('test app', function () {
before(function () {
this.fn = function () {}
this.fn.subFn = function () {}
this.subFnSpy = sinon.spy(this.fn, 'subFn')
this.fnSpy = sinon.spy(this.fn)
})

describe('isActivated is true', function () {
before(function () {
trigger(this.fn, true)
})

it('should invoke fn', function () {
this.fnSpy.callCount.should.equal(1) // return false because callCount = 0
})
})

describe('isActivated is false', function () {
before(function () {
trigger(this.fn, false)
})

it('should invoke subFn', function () {
this.subFnSpy.callCount.should.equal(1) // return false because callCount = 0
})
})
})

我发现 fn 函数上的 spy 有问题,我尝试了两种不同的方法。在这种情况下,两个 spy 都失败了:

app.js:

exports.trigger = function (fn, subFn, isActivated) {
if (isActivated) {
return fn('fn')
}

return subFn('bar')
}

app.test.js

'use strict'

const chai = require('chai')
const sinon = require('sinon')
const trigger = require('../app').trigger

chai.should()

describe('test app', function () {
before(function () {
this.fn = function () {}
this.subFn = function () {}
this.fnSpy = sinon.spy(this.fn)
this.subFnSpy = sinon.spy(this.subFn)
})

beforeEach(function () {
this.fnSpy.reset()
this.subFnSpy.reset()
})

describe('isActivated is true', function () {
before(function () {
trigger(this.fn, this.subFn, true)
})

it('should invoke fn if isActivated is true', function () {
this.fnSpy.callCount.should.equal(1) // return false
})
})

describe('isActivated is false', function () {
before(function () {
trigger(this.fn, this.subFn, false)
})

it('should invoke subFn if isActivated is true', function () {
this.subFnSpy.callCount.should.equal(1) // return false
})
})
})

对我做错了什么有什么建议吗?

最佳答案

我没有找到确切的解决方案,但找到了一个非常接近的解决方法。所以问题似乎在于 this.fnsinon.spy 中的处理方式,因此不是这样做:

this.fnSpy = sinon.spy(this.fn)
this.subFnSpy = sinon.spy(this.subFn)

我们执行以下操作:

this.fnSpy = sinon.spy(this, 'fn')
this.subFnSpy = sinon.spy(this.fn, 'subFn')

我使用 this 来存储 fnsubFn,这很容易。

关于javascript - 未调用方法上的 Sinon.spy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34795934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com