对https://sinonjs.org/releases/v6.3.4/fakes/的翻译
简介
fake
是从 Sinon V5开始引入的. 它合并了 spies
和stubs
的概念,从而简化了它们的使用。
在Sinon中, fake
is 一个 Function
,它记录了调用它的参数,返回值,this
值和抛出的异常。
你可以选择和不选择创建带有行为;fake可以包装一个已存在的函数。
一个fake是不可变的:一旦创建,它的行为不会改变。
不同于sinon.spy
和 sinon.stub
方法, sinon.fake
API 只知道如何创建fake,并不关心自己是如何插入到被测试的系统中的。为了将fake插入到测试系统中,你要使用 sinon.replace*
方法.
创建fake
// 创建一个没有behavior的fake
var fake = sinon.fake();
fake();
console.log(fake.callCount);
// 1
带有behavior的fake
可以创建带有behavior的fake, 一旦创建行为就不能修改。
sinon.fake.returns(value);
返回 参数value
var fake = sinon.fake.returns('apple pie');
fake();
// apple pie
sinon.fake.throws(value);
抛出一个给定message属性值的 Error
.
传入 Error
将其抛出,传入其他值将其作为抛出异常的message
属性值。
var fake = sinon.fake.throws(new Error('not apple pie'));
fake();
// Error: not apple pie
sinon.fake.resolves(value);
生成 fake 返回一个处于resolved状态的 Promise
。
sinon.fake.rejects(value);
生成 fake 返回一个处于rejectd状态的 Promise
。如果一个 Error
传递给 value
,那么它会被当作promise的value。如果其他值传入会作为Error
的message
。
sinon.fake.yields(callback[, value1, ..., valueN]);
fake
希望最后一个参数为回调函数并会用给出的参数调用它。
var fake = sinon.fake.yields('hello world');
fake(console.log);
// hello world
sinon.fake.yieldsAsync(callback[, value1, ..., valueN]);
fake
希望最后一个参数为回调函数并会用给出的参数调用它。
var fake = sinon.fake.yieldsAsync('hello world');
fake(console.log);
// hello world
sinon.fake(func);
包装一个已存在的函数以记录所有的交互,结束调用时提供行为(while leaving it up to the func
to provide the behavior.)。
当所需方法没有被sinon.fake.*
提供时,包装一个已存在函数或方法时非常有用的。
实例属性
f.callback
This property is a convenience to easily get a reference to the last callback passed in the last to the fake.
这个属性可以方便的获得传递给fakede 最后一个回调函数的引用。
var f = sinon.fake();
var cb1 = function () {};
var cb2 = function () {};
f(1, 2, 3, cb1);
f(1, 2, 3, cb2);
f.callback === cb2;
// true
spy calls:也被添加到了一样的便利性
f.getCall(1).callback === cb2;
// true
//
f.lastCall.callback === cb2;
// true
f.lastArg
这个属性可以获取最后一个传递给最后一次fake的参数
var f = sinon.fake();
var date1 = new Date();
var date2 = new Date();
f(1, 2, date1);
f(1, 2, date2);
f.lastArg === date2;
// true
spy calls:也有同样的特性
f.getCall(0).lastArg === date1;
// true
f.getCall(1).lastArg === date2;
// true
f.lastCall.lastArg === date2;
// true
把fake添加到被测系统中
不同于 sinon.spy
and sinon.stub
, sinon.fake
只知道如何创建, 不关心如何替换掉被测系统的相应属性。
为此, 可以使用 sinon.replace
方法.
var fake = sinon.fake.returns('42');
sinon.replace(console, 'log', fake);
console.log('apple pie');
// 42
调用 sinon.restore
方法恢复被插入的属性或方法。
// restores all replaced properties set by sinon methods (replace, spy, stub)
sinon.restore();