4

名前付きエクスポートとしてエクスポートされたサブ関数をスパイしたいのですが、スパイできないようです。

addmultiplyinという 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 という名前です。)addsendEmail

4

1 に答える 1

-2

私自身の質問に対する回避策があります。

現在、multiply()機能は機能と密接に結合していadd()ます。これにより、特にエクスポートされた関数が新しい参照を取得するときに、テストが難しくなります。

したがって、サブ関数呼び出しをスパイするには、代わりにサブ関数を親関数に渡すことができます。はい、dependency injectionです。

したがって、 ではoperations.js、次のように挿入addFnmultiply()て使用します。

const add = (a, b) => {
  return a + b
}

const multiply = (a, b, addFn) => {
  let result = 0

  for (let i = 0; i < b; i++) {
    result = addFn(a, result)
  }
  return result
}

export { add, multiply }

次に、テストでは、次のadd()ように関数をスパイできます。

describe('multiply', () => {
  it('should call add correctly', () => {
      sinon.spy(operations, 'add')

      operations.multiply(10, 5, operations.add)
      expect(operations.add).to.have.been.callCount(5)

      operations.add.restore()
  })
})

現在、サブ関数が正しく呼び出されているかどうかをテストする目的で機能します。

(注: 欠点は、multiply()関数を変更する必要があることです)

于 2016-05-20T14:06:37.490 に答える