チャイ: 'should'構文で未定義をテストする方法


95

上で構築このチャイとangularjsアプリをテストするチュートリアル、私は「べき」スタイルを使用して、未定義値のテストを追加したいです。これは失敗します:

it ('cannot play outside the board', function() {
  scope.play(10).should.be.undefined;
});

エラー「TypeError:プロパティ 'should' of undefined」はありませんが、テストは「expect」スタイルでパスします:

it ('cannot play outside the board', function() {
  chai.expect(scope.play(10)).to.be.undefined;
});

「should」でどのように機能させることができますか?


1
「アサート」を使用する場合は簡単です。次のように実行できますassert.isUndefined(scope.play(10))
lukaserat '15年

回答:


80

これは、should構文の欠点の1つです。すべてのオブジェクトにshouldプロパティを追加することで機能しますが、戻り値または変数値が定義されていない場合、プロパティを保持するオブジェクトがありません。

ドキュメントは、たとえば、いくつかの回避策を提供します:

var should = require('chai').should();
db.get(1234, function (err, doc) {
  should.not.exist(err);
  should.exist(doc);
  doc.should.be.an('object');
});

14
should.not.exist値がnull正しいかどうかを検証するので、この答えは正しくありません。@danielは以下の答えを持っていますshould.equal(testedValue, undefined);。それが受け入れられる答えになるはずです。
セバスチャン

7
私は毎月この回答に来ます(ドキュメントnotではありません):-)
Ralph Cowling

52
should.equal(testedValue, undefined);

chaiのドキュメントで述べたように


12
omg、何を説明しますか?TestedValueが===未定義であることを期待しているので、テストします。多くの開発者は、最初にTestedValueを最初に配置してから、shouldでチェーンし、エラーで終了します...
ダニエル

5
これはそのままでは機能せず、のAPIドキュメントにも記載.equal()されいません。@OurManInBananasが説明を求めた理由を理解できます。これは、期待される値の単一の引数を受け入れる予期された連鎖メソッド形式ではなく、2つの引数を受け入れる関数としてのshouldの予期しない使用です。これ.should()は、@ DavidNormanによる承認済みの回答とこのドキュメントで説明されているように、の呼び出しバージョンをインポート/要求して割り当てることによってのみ達成できます
gfullam 2016

私は、あなたがそのことを見つけると思う.equal、それは物事が失敗したときにより記述されている出力メッセージにあなたを可能にするための構文がはるかに優れたエラーメッセージを生成します
jcollum

17

未定義のテスト

var should = require('should');
...
should(scope.play(10)).be.undefined;

nullをテストする

var should = require('should');
...
should(scope.play(10)).be.null;

偽のテスト、つまり条件で偽として扱われる

var should = require('should');
...
should(scope.play(10)).not.be.ok;

特に便利でも直感的でもありませんが、それは賢いです!
thebenedict

2
役に立たない?これはbddスタイルのIMOでの未定義テストの最良の答えですが、他のnpmパッケージ(shouldパッケージ)をインストールする必要があり、そのために他のパッケージをインストールする価値はないと思います。すばらしい答えですが
Wagner Leonardi


8

未定義のテストに対してshouldステートメントを書くのに苦労しました。以下は動作しません。

target.should.be.undefined();

次の解決策が見つかりました。

(target === undefined).should.be.true()

型チェックとしても書けるなら

(typeof target).should.be.equal('undefined');

上記が正しい方法かどうかはわかりませんが、動作します。

githubのゴーストからの投稿によると


1
この構文を使用すると、JavaScriptが括弧付きの式を前の行を関数として呼び出そうとしたと解釈する可能性があります(セミコロンで行を終了しない場合)。
bmacnaughton

5

これを試して:

it ('cannot play outside the board', function() {
   expect(scope.play(10)).to.be.undefined; // undefined
   expect(scope.play(10)).to.not.be.undefined; // or not
});

おかげで、それは私が上記の2番目の試みでやっていることです。should構文を使用してそれを行う方法を理解したいと思います。
thebenedict 2013年

1

ドキュメントによると、@ david-normanによる答えは正しいです。セットアップに関していくつかの問題があり、代わりに以下を選択しました。

(typeof scope.play(10))。should.be.undefined;


typeof演算子は文字列を返します。したがって、このアサーションは渡されませんでした。cuz'undefined' !== undefined
dNitro 2017

1

havenotキーワードの組み合わせを忘れないでください。

const chai = require('chai');
chai.should();
// ...
userData.should.not.have.property('passwordHash');

0

関数の結果をラップしてshould()、「未定義」のタイプをテストできます。

it ('cannot play outside the board', function() {
  should(scope.play(10)).be.type('undefined');
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.