Chai Spies
これは、chai アサーションライブラリのアドオンプラグインです。最も基本的な関数スパイ機能とテストを提供します。
このライブラリは、主に chai プラグインの開発に関心のある人にとっての出発点として機能することを目的としています。モジュールを開発する場合、これを開始点として使用することを歓迎します。また、モジュールが node.js とブラウザの両方で動作するようにコンパイルツールを使用することをお勧めします。
インストール
Node.js
Chai spies は npm で入手できます。
$ npm install chai-spies
ブラウザ
chai-spies.js
を chai.js
の後に含めてください。
<script src="chai-spies.js"></script>
プラグイン
ブラウザで chai-spies
を使用している場合は、何もする必要はありません。グローバル名前空間の chai
を検出し、自動的に使用されます。
node を使用している場合は、便利なものがここにあります。
const chai = require('chai')
, spies = require('chai-spies');
chai.use(spies);
const should = chai.should()
, expect = chai.expect;
TypeScript の設定
TypeScript を使用している場合、chai-spies
をインポートする方法は次のとおりです。
import { expect } from 'chai';
import spies from 'chai-spies';
chai.use(spies);
ブラウザ向けビルド
現在、このパッケージでは、ソースコードをバンドルするために rollup を使用しています。npm run build
を使用してブラウザ版をビルドしてください。
Chai Spies API リファレンス
スパイの作成
このモジュールでは、スパイは空の関数、または名前付きのラップされた関数のいずれかです。 chai が拡張されたら、chai 自体のインターフェイスを通じてスパイを作成できます。
function original () {
// do something cool
}
const spy = chai.spy(original);
// then use in place of original
ee.on('some event', spy);
// or use without original
const spyAgain = chai.spy();
ee.on('some other event', spyAgain);
spy.on
spy.on
を使用すると、オブジェクトの既存のメソッドにスパイを追加できます。
const array = [1, 2, 3];
chai.spy.on(array, 'push');
// or multiple spies
chai.spy.on(array, ['push', 'pop']);
スパイされたメソッドのカスタム実装を提供することも可能です。
chai.spy.on(array, 'push', function (...items) {
// custom implementation of `push` method
});
アロー関数を使用すると、メソッドの実装を定数に簡単に置き換えることもできます。
chai.spy.on(array, 'push', () => 5);
// or more readable :)
chai.spy.on(array, 'push', returns => 5);
spy.interface
このメソッドは、モック (またはスパイオブジェクト) を作成します。これは、オブジェクトの各メソッドにスパイを備えたインターフェースです。オブジェクトのメソッドには、偽の実装または実装がありません。
// with no implementation
const arrayLike = chai.spy.interface('arrayLike', ['push', 'pop', 'filter']);
// with fake implementation
const arrayLike = chai.spy.interface({
push(item) {
this.__items = this.__items || [];
return this.__items.push(item)
},
// other method implementations
});
arrayLike.push(5);
spy.returns (非推奨)
chai.spy.returns
は、定数を返す関数を作成するだけのシンプルなヘルパーです。
const returnTrue = chai.spy.returns(true);
returnTrue(); // true
アロー関数を使用することをお勧めします。
const returnTrue = chai.spy(returns => true);
サンドボックス
サンドボックスは、一連のスパイです。サンドボックスを使用すると、オブジェクトのメソッドを追跡し、restore
を呼び出すことで元のメソッドを復元できます。サンドボックスを作成するには
const sandbox = chai.spy.sandbox();
describe('Array', () => {
let array;
beforeEach(() => {
array = [];
sandbox.on(array, ['push', 'pop']);
});
afterEach(() => {
sandbox.restore(); // restores original methods on `array`
})
it('allows to add items', () => {
array.push(1);
expect(array.push).to.have.been.called.with(1);
});
});
chai.spy.on
および chai.spy.restore
はデフォルトのサンドボックスにバインドされています。chai.spy.on
によってスパイされたすべてのメソッドを復元するには、chai.spy.restore()
(引数なし) を呼び出すだけです。
restore
メソッドは、復元するオブジェクトと、復元するメソッドまたはメソッドの 2 つのオプション引数を受け取ります。したがって、次の呼び出しも有効です。
const array = [1, 2, 3];
chai.spy.on(array, ['push', 'pop']);
chai.spy.restore(array) // restores all methods on object
chai.spy.restore(array, 'push') // restores only `push` method
アサーション
.spy
オブジェクトがスパイであることをアサートします。
expect(spy).to.be.spy;
spy.should.be.spy;
.called
スパイが呼び出されたことをアサートします。否定は通過します。
expect(spy).to.have.been.called();
spy.should.have.been.called();
called
はチェーン可能なメソッドとして使用できることに注意してください。
.with
スパイが、与えられた引数で少なくとも一度呼び出されたことをアサートします。たとえ、それ以上の引数が提供されていたとしてもです。
spy('foo');
expect(spy).to.have.been.called.with('foo');
spy.should.have.been.called.with('foo');
spy('foo', 'bar')
および spy(); spy('foo')
の場合にも通過します。
複数の引数で使用した場合、スパイが与えられたすべての引数で少なくとも一度呼び出されたことをアサートします。
spy('foo', 'bar', 1);
expect(spy).to.have.been.called.with('bar', 'foo');
spy.should.have.been.called.with('bar', 'foo');
.with.exactly
.with と似ていますが、引数のリストが提供されたものとまったく同じである場合にのみ通過します。
spy();
spy('foo', 'bar');
expect(spy).to.have.been.called.with.exactly('foo', 'bar');
spy.should.have.been.called.with.exactly('foo', 'bar');
spy('foo')
、spy('bar')
、spy('bar'); spy('foo')
、spy('foo'); spy('bar')
、spy('bar', 'foo')
、または spy('foo', 'bar', 1)
では通過しません。
単一の引数を持つ呼び出しにも使用できます。
.always.with
スパイが呼び出されるたびに、引数リストに与えられた引数が含まれていることをアサートします。
spy('foo');
spy('foo', 'bar');
spy(1, 2, 'foo');
expect(spy).to.have.been.called.always.with('foo');
spy.should.have.been.called.always.with('foo');
.always.with.exactly
スパイが、提供されたものとは異なる引数リストで呼び出されたことがないことをアサートします。
spy('foo');
spy('foo');
expect(spy).to.have.been.called.always.with.exactly('foo');
spy.should.have.been.called.always.with.exactly('foo');
.nth(n).called.with
スパイの n 回目の呼び出しが、提供された引数リストで行われたことをアサートします。このアサーションには、他の 3 つのフレーバーが付属しています。
- .first.called.with
- .second.called.with
- .third.called.with
spy('foo');
spy('bar');
spy('baz');
spy('foobar');
expect(spy).to.have.been.first.called.with('foo');
spy.should.have.been.first.called.with('foo');
expect(spy).on.nth(5).be.called.with('foobar');
spy.should.on.nth(5).be.called.with('foobar');
これらのアサーションでは、スパイが少なくとも必要な回数呼び出される必要があります。たとえば
spy('foo');
spy('bar');
expect(spy).to.have.been.third.called.with('baz');
spy.should.have.been.third.called.with('baz');
スパイが 3 回目に呼び出されていないため、通過しません。
.once
スパイがちょうど一度呼び出されたことをアサートします。
expect(spy).to.have.been.called.once;
expect(spy).to.not.have.been.called.once;
spy.should.have.been.called.once;
spy.should.not.have.been.called.once;
.twice
スパイがちょうど 2 回呼び出されたことをアサートします。
expect(spy).to.have.been.called.twice;
expect(spy).to.not.have.been.called.twice;
spy.should.have.been.called.twice;
spy.should.not.have.been.called.twice;
.exactly(n)
スパイがちょうど n
回呼び出されたことをアサートします。
expect(spy).to.have.been.called.exactly(3);
expect(spy).to.not.have.been.called.exactly(3);
spy.should.have.been.called.exactly(3);
spy.should.not.have.been.called.exactly(3);
.min(n) / .at.least(n)
スパイが少なくとも n
回呼び出されたことをアサートします。
expect(spy).to.have.been.called.min(3);
expect(spy).to.not.have.been.called.at.least(3);
spy.should.have.been.called.at.least(3);
spy.should.not.have.been.called.min(3);
.max(n) / .at.most(n)
スパイが最大 n
回呼び出されたことをアサートします。
expect(spy).to.have.been.called.max(3);
expect(spy).to.not.have.been.called.at.most(3);
spy.should.have.been.called.at.most(3);
spy.should.not.have.been.called.max(3);
.above(n) / .gt(n)
スパイが n
回以上呼び出されたことをアサートします。
expect(spy).to.have.been.called.above(3);
expect(spy).to.not.have.been.called.gt(3);
spy.should.have.been.called.gt(3);
spy.should.not.have.been.called.above(3);
.below(n) / .lt(n)
スパイが n
回未満呼び出されたことをアサートします。
expect(spy).to.have.been.called.below(3);
expect(spy).to.not.have.been.called.lt(3);
spy.should.have.been.called.lt(3);
spy.should.not.have.been.called.below(3);
テスト
テストは、BDD インターフェイスで mocha を使用して記述されています。Node テストは npm test
を使用して実行できます。ブラウザテストは、test/browser/index.html
を開くことで確認できます。
貢献者
プロジェクト : chai-spies
リポジトリの期間 : 3 年 2 か月
活動 : 26 日
コミット : 77
ファイル : 12
著者
48 Jake Luer 62.3%
7 Glenn Jorde 9.1%
4 Keith Cirkel 5.2%
3 = 3.9%
3 Sergiy Stotskiy 3.9%
2 JamesMaroney 2.6%
2 PG Herveou 2.6%
2 Ryckes 2.6%
1 Veselin Todorov 1.3%
1 Steffen 1.3%
1 Daniel Walker 1.3%
1 Domenic Denicola 1.3%
1 Andre Jaenisch 1.3%
1 PG 1.3%
ライセンス
(The MIT License)
Copyright (c) 2012 Jake Luer jake@alogicalparadox.com
このソフトウェアおよび関連ドキュメントファイル(以下「ソフトウェア」)のコピーを入手するすべての者に対して、ソフトウェアを無制限に扱うための、使用、コピー、変更、統合、公開、配布、サブライセンス、および/またはソフトウェアのコピーを販売する権利、およびソフトウェアが提供される者に次の条件を条件としてこれを許可する権利を、ここに無償で付与します。
上記の著作権表示およびこの許可表示は、ソフトウェアのすべてのコピーまたは実質的な部分に含まれるものとします。
ソフトウェアは「現状のまま」で提供され、商品性、特定の目的への適合性、および非侵害の保証を含むがこれらに限定されない、明示または黙示のいかなる種類の保証もありません。契約、不法行為、またはその他の行為に関わらず、ソフトウェアの使用またはその他の処理から、またはそれに関連して発生した、いかなる請求、損害、またはその他の責任についても、著者または著作権者は一切責任を負わないものとします。