Mocha: рджрд╛рд╡рд╛ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрдЬрд╛рдп рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде Async рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 5 рдлрд╝рд░ре░ 2014  ┬╖  25рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: mochajs/mocha

рдЗрд╕ рдкреНрд░рдпреЛрдЧ:

    it('returns the correct value', function(done) {
      var returnValue = 5;

      aPromise.then(function() {
        expect(returnValue).to.equal(42);
        done();
      });

    });

рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдЕрднрд┐рдХрдерди рддреНрд░реБрдЯрд┐ рдХреЗ рдмрдЬрд╛рдп timeout of 2000ms exceeded рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ expect() рдХреНрдпреЛрдВрдХрд┐ done() рдХрднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рдФрд░ рдЕрдВрддрддрдГ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рд╡рд╛рджреЗ рдХреЗ рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдХрд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдХреЗрд╡рд▓ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░реЗрдВред рддреЛ рдЖрдкрдХреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

it('returns the correct value', function() {
    var returnValue = 5;

    return aPromise.then(function() {
        expect(returnValue).to.equal(42);
    });
});

рд╕рднреА 25 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреНрдпрд╛ aPromise рдХрднреА рд╣рд▓ рд╣реЛрддрд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдлреЗрдВрдХрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред

@NickHeiner рд╣рд╛рдБ, рдпрд╣ рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ; рдФрд░ рдлрд┐рд░ expect() рдкрд╛рддрд╛ рд╣реИ рдХрд┐ returnValue equal(42) рдФрд░ рдлреЗрдВрдХрддрд╛ рд╣реИред

@gurdiga рдЖрдк рдХреИрд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рджрд╛рд╡рд╛ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рддреЛ рдпрд╣ рдлреЗрдВрдХрддрд╛ рд╣реИ?

@hallas @NickHeiner рдпрд╣рд╛рдБ рдЪрд▓ рд░рд╣реА рдЪреАрдЬрд╝ рд╣реИ: http://jsfiddle.net/gurdiga/p9vmj/ред

@gurdiga рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╡рд╛рджреЗ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдореЗрдВ рдЕрдкрдиреА рддреНрд░реБрдЯрд┐ рд╣реИред рдЕрдкрдиреЗ рд╡рд╛рджреЗ рдореЗрдВ .catch(done) рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд░рд╛рджрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

@ рд╣рд▓реНрд▓рд╛рд╕ рд╡рд╛рд╣: _that_ рдЬрд╡рд╛рдм рдерд╛! :) aPromise.finally() done рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рдЙрдкрдпреБрдХреНрдд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ: рд╡рд╛рджрд╛ рд╣рд▓ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рднреА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред ;)

рд╢реБрдХреНрд░рд┐рдпрд╛!

рдореИрдВ рдмреЗрд╡рдХреВрдл рд▓рдЧрддрд╛ рд╣реВрдБред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдпрд╣ рдорд┐рд▓ рдЧрдпрд╛: рдЬрдм рдХрд┐рд╕реА рднреА рд╡рд╛рджреЗ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреБрдЫ рднреА рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ .then() , .catch() рдпрд╛ .finally() , рддреНрд░реБрдЯрд┐ рд╣реИ рд╡рд╛рджрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╛рд▓рд╛ред рдЗрд╕ рддрд░рд╣, рдкрд░реАрдХреНрд╖рдг рдзрд╛рд╡рдХ рдХрднреА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ, done() рдХреЛ рдХрднреА рднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдХреЛрдИ рджрд╛рд╡рд╛ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреА рдЬрд╛рдП), рдФрд░ рдЗрд╕рд▓рд┐рдП рдЯрд╛рдЗрдо рдЖрдЙрдЯ рддреНрд░реБрдЯрд┐ рдЖрдкрдХреЛ рдЯреЗрд╕реНрдЯ рд░рдирд░ рд╕реЗ рдорд┐рд▓рддреА рд╣реИред

рд╡рд╛рджреЗ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ setTimeout() :

    it('returns the correct value', function(done) {
      var returnValue = 5;

      aPromise.then(function() {
        setTimeout(function() {
          expect(returnValue).to.equal(42);
          done();
        });
      });
    });

рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдзрд╛рд╡рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдпрд╣реА рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИред

done рдкрд╛рд╕ .catch() рдпрд╛ .finally() рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХреЛ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрддреНрддреАрд░реНрдг рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рджрд╛рд╡рд╛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХрднреА рдирд╣реАрдВ рджреЗрдЦ рдкрд╛рдПрдВрдЧреЗред

рдореИрдВ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рдФрд░ рдЕрдВрддрддрдГ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рд╡рд╛рджреЗ рдХреЗ рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдХрд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдХреЗрд╡рд▓ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░реЗрдВред рддреЛ рдЖрдкрдХреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

it('returns the correct value', function() {
    var returnValue = 5;

    return aPromise.then(function() {
        expect(returnValue).to.equal(42);
    });
});

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдЕрднреА рднреА рдореМрдЬреВрдж рд╣реИред рдореБрдЭреЗ рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓ рд░рд╣реА рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рдХреЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдореЙрдбреНрдпреВрд▓ рд╡рд╛рджреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

it("works", function(done) {
    new Something()
    .on("eventA", function(result) {
        expect(result).to.be.true;
    })
    .on("eventB", function(result) {
        expect(result).to.be.false;
        done();
    });
});
  • рдЙрджрд╛рд╣рд░рдг рдХреЛ Promise рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рдЕрддреНрдпрдзрд┐рдХ рд▓рдЧрддрд╛ рд╣реИред
  • рдкреНрд░рддреНрдпреЗрдХ рджрд╛рд╡реЗ рдХреЛ try / catch рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рднреА рдЕрддреНрдпрдзрд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо Error: done() called multiple times ред

рд╡рд┐рдЪрд╛рд░:
http://staxmanade.com/2015/11/testing-asyncronous-code-with-mochajs-and-es7-async-await/

рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореБрдЭреЗ рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рджреЗ рд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдЗ-рдХреИрдЪ рдЕрдиреБрд╢рдВрд╕рд╛ рдЕрдЬреАрдм рд╣реИ: рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдпрд╛рд╕ рдХреЗ рдореВрд▓ рд╡рд╛рджрд╛ рдкреНрд░рдпрд╛рд╕ рд▓рдЧрднрдЧ рд╕рд╣реА рдерд╛, рдЗрд╕реЗ рдХреЗрд╡рд▓ .catch(done) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп then рд░реВрдк рдореЗрдВ done ред (рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪреВрдВрдХрд┐ рдореЛрдЪрд╛ рдХреЗ рдкрд╛рд╕ рд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реАрдзрд╛ рд╕рдорд░реНрдерди рд╣реИ, рдЖрдк рдХреЗрд╡рд▓ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ ...) рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд╛рджрд╛ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛрд╢рд┐рд╢-рдкрдХрдбрд╝ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдереА, рдпрд╣ рджреВрд╕рд░рд╛ рд╣реИрдВрдбрд▓рд░ рдерд╛ рдкрд╣рд▓реЗ рд╣реИрдВрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде then рдХреЛ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд catch рд╣реИ; рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рд╡рд╛рджреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдФрдЪрд┐рддреНрдп рдерд╛, рд▓реЗрдХрд┐рди рд╡рд╛рджреЗ рдРрд╕реЗ рд╣реА рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдХрдИ then s рдереЗ, рддреЛ рдХреЗрд╡рд▓ рдПрдХ рдЕрдВрддрд┐рдо .catch(done) рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░ рдЯреНрд░рд╛рдЗ-рдХреИрдЪ рдкрд░ рд╢реНрд░реЗрд╖реНрдарддрд╛ рдХрд╛ рдПрдХ рдмрд┐рдВрджреБ рд╣реИ (рд╢реАрд░реНрд╖ рдкрд░) рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ .catch(done) рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реИ)ред

рдЖрдкрдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП:

  1. рдХреНрдпрд╛ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ рджреЛрдиреЛрдВ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ? рдпрджрд┐ рд╡реЗ рдирд╣реАрдВ рд╣реЛрддреЗ, рддреЛ рдЖрдкрдХрд╛ рдкрд░реАрдХреНрд╖рдг рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдлрд▓рддрд╛ рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓ рджреЗрддрд╛?
  2. рдЖрдкрдХреЗ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рд╕реЗ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдпрджрд┐ рд╡реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдореЗрдВ рдкреНрд░рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдкреАрдЖрдИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП .on("error", function(error) {...}) ) рдкрд░ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ, рддреЛ рд╡реЗ рдореЛрдЪрд╛ рддрдХ рдХрднреА рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЙрдирдХреА рдмрд╛рдд рдирд╣реАрдВ рд╕реБрдирддреЗ рдФрд░ рд╢реНрд░реЛрддрд╛ done рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ (рдпрд╛ рд╢реНрд░реЛрддрд╛ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ done рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрджрд┐ рд╢реНрд░реЛрддрд╛ рдиреЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП .on("error", done) ред рд╕рдВрднрд╡рддрдГ рд╡рд╣ рднреА рдХреЗрд╡рд▓ рдкреНрд░рддрд┐ рдкрд░реАрдХреНрд╖рдг рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рди рдХрд┐ рдПрдХ рдмрд╛рд░ рдкреНрд░рддрд┐ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░, рдЬреИрд╕реЗ .catch(done) рдПрдХ рд╡рд╛рджреЗ рдореЗрдВред
  1. рд╣рд╛рдВ, рдФрд░ рдореИрдВ рдПрдХ "end" / "drain" рдИрд╡реЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреНрдп рдИрд╡реЗрдВрдЯ рдореЗрдВ рдмреВрд▓рд┐рдпрди рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдереЗред
  2. рдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдПрдХ рджреБрдмрд▓рд╛ рдФрд░ рд╕рд╛рдл рд╡рд┐рдХрд▓реНрдк рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдЕрднреА рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЖрдкрдХреЗ рдПрдкреАрдЖрдИ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреИрд╕реЗ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рдБ, рдЕрднреА рддрдХ рдореИрдВ _рдХрдм_ рдХреБрдЫ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдордЖрдЙрдЯ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдлрд┐рд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ _how/why_ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрджрд╛рдИ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЪреАрдЬреЗрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЯреВрдЯрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмреЗрд╣рддрд░ рдбрд┐рдЬрд╛рдЗрди рдХреА рдХрдореА рдХрд╛ рдмрд╣рд╛рдирд╛ рдирд╣реАрдВ рд╣реИ (рдореЗрд░реА рдУрд░ рд╕реЗ, рдЬреНрдпрд╛рджрд╛рддрд░)ред

@stevenvachon : рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рдорд╛рдлрд╝ рдХрд░ рджреЛ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рддрддреНрдХрд╛рд▓ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред рдЖрдкрдХреЗ рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛рдУрдВ рдореЗрдВ рдХрд┐рдП рдЧрдП рджрд╛рд╡реЗ рдХреЛ рдореЛрдЪрд╛ рджреНрд╡рд╛рд░рд╛ uncaughtException рдореИрдкрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬрдм рддрдХ рдХрд┐ рдИрд╡реЗрдВрдЯ рдПрдорд┐рдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢реНрд░реЛрддрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝ рдирд╣реАрдВ рд░рд╣рд╛ рд╣реИ рдФрд░ error рдИрд╡реЗрдВрдЯ рдпрд╛ рдХреБрдЫ рдФрд░ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рддрдм рднреА рдЖрд╕рд╛рди рд╣реИ рд╣рд▓ рдХрд░реЗрдВ)ред

рдЕрдм рдпрджрд┐ рд╣реБрдб рдХреЗ рддрд╣рдд рдЖрдкрдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╛рджреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рджреЗ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рджрд╛рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдЦрд╛рдП рдЧрдП" рд╣реЛрдВрдЧреЗред рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ unhandledRejection ред

рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реЗ рдПрдХ рд╕реЗрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реВрдВ рдЬреЛ рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рддреА рд╣реИ:

process.on('unhandledRejection', function (reason)
{
    throw reason;
});

рдиреЛрдЯ: рдЗрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрд▓реНрдмреЛ рдЧреНрд░реАрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЛрдЪрд╛ рдЗрд╕ рддрд░рд╣ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ рдЬреИрд╕реЗ рдпрд╣ uncaughtException рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ; рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореИрдВ рд╡рд╛рджреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ!

[email protected] . рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ

    it('Convert files into base64', (resolve) => {
        let files = Promise.all(promises);

        return files
            .then(([actual, expected]) => {
                assert.equal(actual, expected, 'Files not are equal');
                resolve();
            })
            .catch(error => resolve);
    });
   Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.

.catch рдЧрд▓рдд рд╣реИред error => resolve function(error) { return resolve } рдмрд░рд╛рдмрд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ resolve рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде resolve рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдХрд┐ error => resolve(error) ред рдмреЗрд╢рдХ, рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди X рдЬреЛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди Y рдХреЛ рдЙрд╕реА рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ X рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ Y рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдХреЙрд▓рдмреИрдХ, рдЗрд╕рд▓рд┐рдП .catch(error => resolve(error)) рдХреЛ рднреА рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ .catch(resolve) ред (рдЖрдкрдХреЛ рдХреЗрд╡рд▓ resolve рд╕реАрдзреЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдпрджрд┐ рдЖрдк рдЗрд╕реЗ then рдкрд╛рд╕ рдХрд░ рд░рд╣реЗ рдереЗ рдФрд░ рдЗрд╕рд▓рд┐рдП, then рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ resolve рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ then(()=>resolve()) рдмрдЬрд╛рдп рдХреЗрд╡рд▓ .then(resolve) ; рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЖрдк рджрд╛рд╡реЗ рдХреЗ рд▓рд┐рдП then рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рд╕рд╛рдордиреЗ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ ред)

(рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд░реВрдк рд╕реЗ, resolve рдХреЛ рд╢рд╛рдпрдж done рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫ рдирд╛рдо рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдлрд▓рддрд╛ рдФрд░ рд╡рд┐рдлрд▓рддрд╛ рдФрд░ рдиреНрдпрд╛рдпрд╛рдзреАрд╢реЛрдВ рджреЛрдиреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдЗрд╕реЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВ рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП рдореЛрдЪрд╛ рдХреЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рдирд╛рдоред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рдкрдврд╝реЗрдВред)

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рдХреЗрд╡рд▓ рд╡рд╛рджреЗ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдХреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдХреЗ рдЗрд╕реЗ рдФрд░ рднреА рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореЛрдЪрд╛ рдкрд░реАрдХреНрд╖рдг рдХреА рд╕рдлрд▓рддрд╛ рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдлрд▓ рдпрд╛ рдЕрд╕рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рд╡рд╛рджреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ (рдмрд╢рд░реНрддреЗ рдХреЛрдИ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИ) рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рд░реЛрд╣; рдШрдЯрдирд╛ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрднреА рднреА рд╣реИрд╢ рдЖрдЙрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ):

it('Convert files into base64', () => {
    let files = Promise.all(promises);
    return files
        .then(([actual, expected]) => {
            assert.equal(actual, expected, 'Files not are equal');
        })
});

@lsphillips рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!! рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЛрдЪрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рднреА рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ред рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА #2640 рдмрдирд╛рдпрд╛ рд╣реИред

рдореБрдЭреЗ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрд╛! рдЙрдкрд░реЛрдХреНрдд рдЙрддреНрддрд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпреЗ рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

npm install --save mocha expect.js q
./node_modules/mocha/bin/mocha test.spec.js

// test.spec.js

var $q = require('q');
var expect = require('expect.js');

describe('tests with done', function(){
    it('returns the correct value from promise', function(done) {
      var returnValue = 5;
      var def = $q.defer();
      def.promise.then((val) => {
        expect(val).to.equal(42);
        done();
      }).catch(done);
      def.resolve(returnValue)
    });
})

describe('tests returning promises', function(){
    it('returns the correct value from promise', function() {
      var returnValue = 5;
      var def = $q.defer();
      def.resolve(returnValue)
      return def.promise.then((val) => {
        expect(val).to.equal(42);
      });
    });
})
  tests with done
    1) returns the correct value from promise

  tests returning promises
    2) returns the correct value from promise


  0 passing (15ms)
  2 failing

  1) tests with done returns the correct value from promise:
     Error: expected 5 to equal 42
      at Assertion.assert (node_modules/expect.js/index.js:96:13)
      at Assertion.be.Assertion.equal (node_modules/expect.js/index.js:216:10)
      at def.promise.then (tests/test.spec.js:9:24)
      at _fulfilled (node_modules/q/q.js:854:54)
      at self.promiseDispatch.done (node_modules/q/q.js:883:30)
      at Promise.promise.promiseDispatch (node_modules/q/q.js:816:13)
      at node_modules/q/q.js:570:49
      at runSingle (node_modules/q/q.js:137:13)
      at flush (node_modules/q/q.js:125:13)
      at _combinedTickCallback (internal/process/next_tick.js:67:7)
      at process._tickCallback (internal/process/next_tick.js:98:9)

  2) tests returning promises returns the correct value from promise:
     Error: expected 5 to equal 42
      at Assertion.assert (node_modules/expect.js/index.js:96:13)
      at Assertion.be.Assertion.equal (node_modules/expect.js/index.js:216:10)
      at def.promise.then (tests/test.spec.js:22:24)
      at _fulfilled (node_modules/q/q.js:854:54)
      at self.promiseDispatch.done (node_modules/q/q.js:883:30)
      at Promise.promise.promiseDispatch (node_modules/q/q.js:816:13)
      at node_modules/q/q.js:570:49
      at runSingle (node_modules/q/q.js:137:13)
      at flush (node_modules/q/q.js:125:13)
      at _combinedTickCallback (internal/process/next_tick.js:67:7)
      at process._tickCallback (internal/process/next_tick.js:98:9)

@gurdiga рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ () рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рднреА рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдереА, рд▓реЗрдХрд┐рди рдЕрдм рдореБрдЭреЗ рдХрдо рд╕реЗ рдХрдо рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ!

рдореЗрд░реЗ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдореИрдВрдиреЗ рджреБрдГрд╕реНрд╡рдкреНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдВрддрд┐рдо рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ред рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди .catch(done) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣ рдЕрдиреНрдп рдХреИрдЪ рдХреЙрд▓рдмреИрдХ рдХреЗ рдЕрдВрджрд░ done(error) рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

describe('Clicking in any bad reputation tag', () => {
    it('open the bad reputation modal', (done) => {
      nightmare
        .select('#per-page', '50')
        .waitForAjax()
        .click('[data-reputation="bad"]')
        .evaluate(function() {
          return document.querySelector('.vue-modal .ls-modal-title').innerText
        })
        .then(function(title) {
          title.should.equal('Sua segmenta├з├гo teve uma avalia├з├гo ruim!')
          done()
        })
        .catch((error) => {
          screenshot(nightmare)
          done(error)
        })
    })
  })

@itumoraes рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

describe('Clicking in any bad reputation tag', () => {
    it('open the bad reputation modal', () => {
      return nightmare
        .select('#per-page', '50')
        .waitForAjax()
        .click('[data-reputation="bad"]')
        .evaluate(function() {
          return document.querySelector('.vue-modal .ls-modal-title').innerText
        })
        .then(function(title) {
          title.should.equal('Sua segmenta├з├гo teve uma avalia├з├гo ruim!')
        })
    })
  })

рдпрджрд┐ рдЖрдк рдХреЛрдИ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ done() рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред Mocha, Express, рдФрд░ Mongoose рдХреЗ рд╕рд╛рде Async/Await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрд░рд╛ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рджреЗрдЦреЗрдВ

рдореИрдВрдиреЗ рдиреАрдЪреЗ рджреА рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╣реА рдЯрд╛рдЗрдордЖрдЙрдЯ рддреНрд░реБрдЯрд┐ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдпрд╛ред

рдорд╛рдЗрд╕реНрдХреНрд░рд┐рдкреНрдЯ:

рд╡рд░реНрдгрди рдХрд░реЗрдВ ("getBillingDetail", async рдлрд╝рдВрдХреНрд╢рди (){
рдпрд╣ред рд╕рдордпрдмрд╛рд╣реНрдп (55000);
it.only ("рдЪреЗрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╡реИрдз рдЬреЙрдмрдирд╛рдо", async рдлрд╝рдВрдХреНрд╢рди (рдХрд┐рдпрд╛ рдЧрдпрд╛) {
рдпрд╣ред рд╕рдордпрдмрд╛рд╣реНрдп (55000);
рд╡рд░ рдкрд░рд┐рдгрд╛рдо = рдкреНрд░рддреАрдХреНрд╖рд╛ url.getBillingDetail('12254785565647858');
рдХрдВрд╕реЛрд▓.рд▓реЙрдЧ (рдкрд░рд┐рдгрд╛рдо);
рдЬреЛрд░ рджреЗрдВред рдмрд░рд╛рдмрд░ (рдкрд░рд┐рдгрд╛рдо, рд╕рддреНрдп);
});
});

рддреНрд░реБрдЯрд┐: 55000ms рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред рдПрд╕рд┐рдВрдХреНрд╕ рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╣реБрдХ рдХреЗ рд▓рд┐рдП, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ "рдХрд┐рдпрд╛ ()" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ; рдпрджрд┐ рдХреЛрдИ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡рд╣ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдХрдИ рдмрдВрдж рдореБрджреНрджреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рдмрд╛рдд рдХреА рд╡рд░реНрддрдиреА рдмрдВрдж рдХрд░реЛред рдПрдХ рдХрд┐рдП рдЧрдП рдХреЙрд▓рдмреИрдХ рдХреЛ async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдкрд╛рд╕ рди рдХрд░реЗрдВред рдПрд╕рд┐рдВрдХреНрд╕ рдкрд░реАрдХреНрд╖рдг рдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрдврд╝реЗрдВ

@Munter рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рдХреЙрд▓рдмреИрдХ рд╣рдЯрд╛ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпреЗ рддреНрд░реБрдЯрд┐ рдлрд┐рд░ рд╕реЗ рд╣реЛрддреА рд╣реИ

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╡рд╛рджрд╛ рдХрднреА рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

eschwartz picture eschwartz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

helloravi picture helloravi  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Aarbel picture Aarbel  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

delta62 picture delta62  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

danielserrao picture danielserrao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ