рдЗрд╕ рдкреНрд░рдпреЛрдЧ:
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()
рдХрднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдХреНрдпрд╛ 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)
рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реИ)ред
рдЖрдкрдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП:
.on("error", function(error) {...})
) рдкрд░ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ, рддреЛ рд╡реЗ рдореЛрдЪрд╛ рддрдХ рдХрднреА рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЙрдирдХреА рдмрд╛рдд рдирд╣реАрдВ рд╕реБрдирддреЗ рдФрд░ рд╢реНрд░реЛрддрд╛ done
рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ (рдпрд╛ рд╢реНрд░реЛрддрд╛ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ done
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрджрд┐ рд╢реНрд░реЛрддрд╛ рдиреЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП .on("error", done)
ред рд╕рдВрднрд╡рддрдГ рд╡рд╣ рднреА рдХреЗрд╡рд▓ рдкреНрд░рддрд┐ рдкрд░реАрдХреНрд╖рдг рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рди рдХрд┐ рдПрдХ рдмрд╛рд░ рдкреНрд░рддрд┐ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░, рдЬреИрд╕реЗ .catch(done)
рдПрдХ рд╡рд╛рджреЗ рдореЗрдВред"end"
/ "drain"
рдИрд╡реЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЕрдиреНрдп рдИрд╡реЗрдВрдЯ рдореЗрдВ рдмреВрд▓рд┐рдпрди рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдереЗредрдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдЕрднреА рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЖрдкрдХреЗ рдПрдкреАрдЖрдИ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреИрд╕реЗ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред
рд╣рд╛рдБ, рдЕрднреА рддрдХ рдореИрдВ _рдХрдм_ рдХреБрдЫ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдордЖрдЙрдЯ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдлрд┐рд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ _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 рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рдХреЙрд▓рдмреИрдХ рд╣рдЯрд╛ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпреЗ рддреНрд░реБрдЯрд┐ рдлрд┐рд░ рд╕реЗ рд╣реЛрддреА рд╣реИ
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╡рд╛рджрд╛ рдХрднреА рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рдФрд░ рдЕрдВрддрддрдГ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рд╡рд╛рджреЗ рдХреЗ рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдХрд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдХреЗрд╡рд▓ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░реЗрдВред рддреЛ рдЖрдкрдХреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: