0

関数式で sinon スパイを作成することは可能ですか? たとえば、このコードを見てください。

function one() { return 1; }
function two() { return 2; }
function three() { return 3; }

function myMethod() {
  var n1 = one();
  var n2 = two();
  var n3 = three();
  return n1 + n2 + n3;
}


QUnit.module('My test');

QUnit.test('testing functions', (assert) => {
  assert.expect(3);
  
  const spyOne = sinon.spy(one);
  const spyTwo = sinon.spy(two);
  const spyThree = sinon.spy(three);
	myMethod();

  assert.ok(spyOne.called, "called one");
  assert.ok(spyTwo.called, "called two");
  assert.ok(spyThree.called, "called three");
  
  sinon.restore();
});

私が電話myMethod()してスパイがいるにもかかわらず、私one - two - threeはまだ偽になります( と についてもone.called同じです)twothree

ここで何が欠けていますか?

ありがとう!

4

1 に答える 1

3

の呼び出しsinon.spy(fn)は変更されず、 を呼び出す新しい関数 (スパイ) がfn作成されるだけです。fn

onetwo、をテストできるようにするにthreeは、これらの関数 (またはその参照) をスパイに置き換え、後で復元する必要があります。

// keep references to the original functions
var _one   = one;
var _two   = two;
var _three = three;

// replace the original functions with spies
one   = sinon.spy(one);
two   = sinon.spy(two);
three = sinon.spy(three);

// call our method
myMethod();

// test
assert.ok(one.called,   "called one");
assert.ok(two.called,   "called two");
assert.ok(three.called, "called three");

// restore the original functions
one   = _one;
two   = _two;
three = _three;

ただし、これは理想的ではありません。可能であれば、すべての関数を 1 つのオブジェクトにグループ化することをお勧めします。これにより、シノンはオリジナル自体を復元することもできます。

于 2016-05-07T19:50:10.753 に答える