名前付きエクスポートとしてエクスポートされたサブ関数をスパイしたいのですが、スパイできないようです。
add
とmultiply
inという 2 つの関数があり、operations.js
それらを名前付きエクスポートとしてエクスポートするとします。
const add = (a, b) => {
return a + b
}
const multiply = (a, b) => {
let result = 0
for (let i = 0; i < b; i++) {
result = add(a, result)
}
return result
}
export { add, multiply }
そして、テストファイルは関数sinon-chai
をスパイしようとするために使用しadd
ます:
import chai, { expect } from 'chai'
import sinon from 'sinon'
import sinonChai from 'sinon-chai'
import * as operations from './operations'
chai.use(sinonChai)
describe('multiply', () => {
it('should call add correctly', () => {
sinon.spy(operations, 'add')
operations.multiply(10, 5)
expect(operations.add).to.have.been.callCount(5)
operations.add.restore()
})
})
結果は
AssertionError: expected add to have been called exactly 5 times, but it was called 0 times
しかし、operations.add
次のように直接呼び出すと、テストに合格します。
describe('multiply', () => {
it('should call add correctly', () => {
sinon.spy(operations, 'add')
operations.add(0, 5)
operations.add(0, 5)
operations.add(0, 5)
operations.add(0, 5)
operations.add(0, 5)
expect(operations.add).to.have.been.callCount(5)
operations.add.restore()
})
})
sinon-spy が新しい参照を作成するように見えますoperations.add
が、multiply
関数は既にバインドされている古い参照をまだ使用しています。
これらの関数がエクスポートと名付けられている場合add
、この関数の機能をスパイする正しい方法は何ですか?multiply
一般に、テスト済みの親関数のサブ関数をスパイするにはどうすればよいですか? どちらもエクスポートと呼ばれますか?
[アップデート]
multiply
関数はほんの一例です。私の主なポイントは、親関数がサブ関数を呼び出すかどうかをテストすることです。しかし、そのテストがサブ関数の実装に依存することは望ましくありません。したがって、サブ関数が呼び出されているかどうかをスパイしたいだけです。multiply
関数は関数であり、関数はregisterMember
関数であると想像できます。(どちらの関数も exports という名前です。)add
sendEmail