javascript - mocha js asersi menggantung saat menggunakan promise?


"use strict";
let assert = require("assert");

describe("Promise test", function() {
  it('should pass', function(done) {
    var a = {};
    var b = {};
    a.key = 124;
    b.key = 567;
    let p = new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve();
        }, 100)
    });

    p.then(function success() {

        console.log("success---->", a, b);
        assert.deepEqual(a, b, "response doesnot match");
        done();
    }, function error() {

        console.log("error---->", a, b);
        assert.deepEqual(a, b, "response doesnot match");
        done();
    });
 });
});

Keluaran :

Saya sedang menggunakan node v5.6.0. Tes tampaknya macet pada assert ketika nilainya tidak cocok.

Saya mencoba memeriksa apakah ini masalah dengan assert.deepEqual menggunakan setTimeout tapi ini bekerja dengan baik.

Tapi itu gagal saat menggunakan Promise dan macet jika nilainya tidak cocok.

Jawaban #1

Anda mendapatkan kesalahan itu, karena pengujian Anda tidak pernah selesai. Pernyataan ini: assert.deepEqual(a, b, "response doesnot match"); memunculkan kesalahan, dan karena Anda tidak memiliki blok tangkap, callback done tidak pernah dipanggil.

Anda harus menambahkan blok catch di akhir rantai promise:

...
p.then(function success() {
    console.log("success---->", a, b);
    assert.deepEqual(a, b, "response doesnot match");
    done();
}, function error() {
    console.log("error---->", a, b);
    assert.deepEqual(a, b, "response doesnot match");
    done();
})
.catch(done); // <= it will be called if some of the asserts are failed

Jawaban #2

Karena Anda menggunakan Promise, saya menyarankan untuk cukup mengembalikannya di akhir it. Setelah Promise selesai (terpenuhi atau ditolak), Mocha akan menganggap tes selesai dan akan menggunakan Promise tersebut. Jika Promise ditolak, ia akan menggunakan nilainya sebagai Error yang dilemparkan.

NB: jangan mendeklarasikan argumen done jika Anda mengembalikan sebuah Promise.