web-dev-qa-db-ja.com

sinonを使用して別の関数(テスト中)内の関数をモックする方法は?

機能があるとしましょう

Func a() {
    //Do Something
    let c = b();
    return c;
}

関数aとモックをテストしたいb()そしてモックでcを割り当てたいSinon.Stub(Test、 "b")。returns( "DummyValue"); cはDummyValueが割り当てられます。

どうやってやるの?

describe("a", () => {
    let a = a();
    //mock b();
    action = execute(a);
    expect(action).should.return.("DummyValue");
})
15
Ravi Shankar

同じファイルに2つの関数があり、そのうちの1つをスタブ化して、もう1つをテストしたい場合。例:テスト:tests.js

let ComputeSumStub = sinon.stub(OfflineLoader, "ComputeSum");
const ans = function ()
{
    return 10;
};
ComputeSumStub.returns(ans);
const actualValue: number = OfflineLoader.sum();
expect(actualValue).to.be.equal(10);

開発:foo.js

function sum(): number
{
    return ComputeSum(8, 9);
}

function ComputeSum(a: number, b: number): number
{
    return a + b;
}

コンパイル後、関数は完全な名前で異なるシグネチャでエクスポートされ、スタブ中にグローバル関数をスタブしますが、他の関数内からそれを呼び出すときにローカル関数を呼び出すため、これは機能しません。そのための回避策があります。

foo.js
const factory = {
  a,
  b,
}
function a() {
  return 2;
}

function b() {
  return factory.a();
}

module.exports = factory;

test.js

const ser = require('./foo');
const sinon = require('sinon');

const aStub = sinon.stub(ser, 'a').returns('mocked return');
console.log(ser.b());
console.log(aStub.callCount);

参照: シノンを使用した同じファイル内のメソッドのスタブ

3
Ravi Shankar

この場合、シノンスタブの方がモックよりも適切ですモックvsスタブを使用する場合

原則として、特定の呼び出しにアサーションを追加しない場合は、モックしないでください。代わりにスタブを使用してください。

テストでのアサーションは、関数の特定の呼び出し、つまり1回目または3回目の呼び出しではなく、すべての呼び出しに対するものです。

これは、呼び出される方法(引数または呼び出しの数)に関係なく常に同じ結果を返すようにスタブをプログラムしているため、これをtelにすることができます。

シノンスタブ関数を関数aの引数として渡します。

Function a(b) {
    const c = b();

    return c;
}

test.js

require("sinon")

describe("a", () => {
    const stub = sinon.stub();
    stub.returns("DummyValue");
    expect(a(stub)).to.eql.("DummyValue");
})

これらの変数宣言は決して再割り当てされないため、constを使用できることに注意してください。

1
therewillbecode

関数のみスタブできます

  • パラメータとして渡すと、sinonのようなテストダブルライブラリで偽造します。
  • またはそれが依存関係である場合(importまたはrequireを介してロードされます)。そのような場合、proxyquireを使用して、テスト中のモジュールの偽のb関数を渡すことができます。関数自体は、sinonまたは他のテストdoubleライブラリによって偽造される可能性があります。
0
luboskrnac