Chai Spies

これは、chai アサーションライブラリのアドオンプラグインです。最も基本的な関数スパイ機能とテストを提供します。

このライブラリは、主に chai プラグインの開発に関心のある人にとっての出発点として機能することを目的としています。モジュールを開発する場合、これを開始点として使用することを歓迎します。また、モジュールが node.js とブラウザの両方で動作するようにコンパイルツールを使用することをお勧めします。

インストール

Node.js

Chai spies は npm で入手できます。

  $ npm install chai-spies

ブラウザ

chai-spies.jschai.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

このソフトウェアおよび関連ドキュメントファイル(以下「ソフトウェア」)のコピーを入手するすべての者に対して、ソフトウェアを無制限に扱うための、使用、コピー、変更、統合、公開、配布、サブライセンス、および/またはソフトウェアのコピーを販売する権利、およびソフトウェアが提供される者に次の条件を条件としてこれを許可する権利を、ここに無償で付与します。

上記の著作権表示およびこの許可表示は、ソフトウェアのすべてのコピーまたは実質的な部分に含まれるものとします。

ソフトウェアは「現状のまま」で提供され、商品性、特定の目的への適合性、および非侵害の保証を含むがこれらに限定されない、明示または黙示のいかなる種類の保証もありません。契約、不法行為、またはその他の行為に関わらず、ソフトウェアの使用またはその他の処理から、またはそれに関連して発生した、いかなる請求、損害、またはその他の責任についても、著者または著作権者は一切責任を負わないものとします。