1. ホーム
  2. node.js

[解決済み] モカやチャイを使った約束事を正しくテストするにはどうしたらいいですか?

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 しかし、個人的には、現在のバージョンの明快さとシンプルさが好きです。