[解決済み] モカやチャイを使った約束事を正しくテストするにはどうしたらいいですか?
2022-04-23 23:45:06
質問
次のテストの動作がおかしい。
it('Should return the exchange rates for btc_ltc', function(done) {
var pair = 'btc_ltc';
shapeshift.getRate(pair)
.then(function(data){
expect(data.pair).to.equal(pair);
expect(data.rate).to.have.length(400);
done();
})
.catch(function(err){
//this should really be `.catch` for a failed request, but
//instead it looks like chai is picking this up when a test fails
done(err);
})
});
拒否されたプロミスを適切に処理する(そしてそれをテストする)にはどうしたらよいでしょうか?
失敗したテストはどのように処理すればよいのでしょうか(例.
expect(data.rate).to.have.length(400);
?
以下は、私がテストしている実装です。
var requestp = require('request-promise');
var shapeshift = module.exports = {};
var url = 'http://shapeshift.io';
shapeshift.getRate = function(pair){
return requestp({
url: url + '/rate/' + pair,
json: true
});
};
解決方法は?
最も簡単なのは、Mocha が最近のバージョンで持っているビルトインの約束事サポートを利用することでしょう。
it('Should return the exchange rates for btc_ltc', function() { // no done
var pair = 'btc_ltc';
// note the return
return shapeshift.getRate(pair).then(function(data){
expect(data.pair).to.equal(pair);
expect(data.rate).to.have.length(400);
});// no catch, it'll figure it out since the promise is rejected
});
あるいはモダンなNodeとasync/awaitで。
it('Should return the exchange rates for btc_ltc', async () => { // no done
const pair = 'btc_ltc';
const data = await shapeshift.getRate(pair);
expect(data.pair).to.equal(pair);
expect(data.rate).to.have.length(400);
});
このアプローチは約束事エンドツーエンドなので、テストがしやすく、変なケースを考えてしまうこともありません。
done()
があちこちで呼び出されています。
これは、現時点ではJasmineのような他のライブラリに対してMochaが持つアドバンテージです。また
チャイ・アズ・プロミーズ
を使えば、さらに簡単になります。
.then
しかし、個人的には、現在のバージョンの明快さとシンプルさが好きです。
関連
-
[解決済み] テスト
-
[解決済み】passport.js passport.initialize() ミドルウェアが使用されていません。
-
[解決済み] ExpressJS : res.redirect()が期待通りに動作しない?
-
[解決済み] TypeErrorです。リクエストパスにエスケープされていない文字が含まれています。
-
[解決済み] エラーです。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりません。
-
[解決済み] 既存のコールバックAPIをプロミスに変換するにはどうすればよいですか?
-
[解決済み] Mochaで単一のテストを実行するには?
-
[解決済み】PromiseとObservablesの違いは何ですか?
-
[解決済み】Mocha / Chai expect.to.throwがスローエラーをキャッチしない
-
[解決済み】chaiのテスト配列の等式が期待通りに動作しない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Nodejs: Errorを解決する方法。ENOENT: そのようなファイルまたはディレクトリがありません
-
[解決済み】Discord.js が特定のチャンネルにメッセージを送信する場合
-
[解決済み】npx コマンドが見つかりません。
-
[解決済み】MongoDBのデータ/DBが見つからない
-
[解決済み】npm 5で作成されたpackage-lock.jsonファイルはコミットするのでしょうか?
-
[解決済み] MongoClient v3.0使用時、db.collectionが関数でない
-
[解決済み] AWS lambda function error - Unable to import module 'index': エラー
-
[解決済み] npm install エラー - ローカルの発行者証明書を取得できません。
-
[解決済み] S3 Bucket に何かを送信しようとすると、AWS Missing credentials が表示される (Node.js)
-
[解決済み] Macでポート3000をロックしているプロセスを見つける(そして殺す)【終了