이 질문은 NodeJS에 대한 모카 테스트 프레임 워크와 관련이 있습니다.Async Mocha 테스트 (NodeJS)를 순서대로 실행하려면 어떻게해야합니까?
기본 동작은 모든 테스트를 시작 그들이에서 와서 비동기 콜백을 처리 할 것으로 보인다.
비동기 테스트를 실행할 때, 나는의 비동기 부분 후 각 테스트 를 실행하고 싶습니다 하나는 이전에 호출되었습니다.
어떻게하면됩니까?
이 질문은 NodeJS에 대한 모카 테스트 프레임 워크와 관련이 있습니다.Async Mocha 테스트 (NodeJS)를 순서대로 실행하려면 어떻게해야합니까?
기본 동작은 모든 테스트를 시작 그들이에서 와서 비동기 콜백을 처리 할 것으로 보인다.
비동기 테스트를 실행할 때, 나는의 비동기 부분 후 각 테스트 를 실행하고 싶습니다 하나는 이전에 호출되었습니다.
어떻게하면됩니까?
"구조화 된 코드가 구조화 된 순서대로 실행됩니다"(놀라워요!) - @chrisdew 에서처럼 비동기 테스트의 반환 순서는 보장 할 수 없습니다. 문제를 다시 말하면 (동기 실행) 체인 아래쪽에있는 테스트에서는이 비동기 테스트로 설정된 필수 조건을 실행할 때까지 준비 할 수 있음을 보장 할 수 없습니다.
첫 번째 테스트 (로그인 토큰 등)에서 특정 조건을 설정해야하는 경우 진행하기 전에 테스트 조건이 설정되어있는 before()
과 같은 후크를 사용해야합니다. 블록에서
랩 종속 테스트 및 그들에 비동기before
후크 실행 (알을 전과 블록에 '다') :
var someCondition = false
// ... your Async tests setting conditions go up here...
describe('is dependent on someCondition', function(){
// Polls `someCondition` every 1s
var check = function(done) {
if (someCondition) done();
else setTimeout(function(){ check(done) }, 1000);
}
before(function(done){
check(done);
});
it('should get here ONLY once someCondition is true', function(){
// Only gets here once `someCondition` is satisfied
});
})
내가 사용하는대로 작성한 것에 놀랐습니다. 나는 bdd 스타일 테스트 (설명/그것)와 함께 모카를 사용하고, 단지 내 console.logs를 내 테스트에 추가하여 당신의 주장이 내 경우를 견디지 만 겉으로보기에는 그렇지 않은지 확인합니다.
다음은 "end1"및 "start1"의 순서를 보았을 때 사용한 코드 조각입니다. 그들은 제대로 주문되었습니다. 물론
describe('Characters start a work', function(){
before(function(){
sinon.stub(statusapp, 'create_message');
});
after(function(){
statusapp.create_message.restore();
});
it('creates the events and sends out a message', function(done){
draftwork.start_job(function(err, work){
statusapp.create_message.callCount.should.equal(1);
draftwork.get('events').length.should.equal(
statusapp.module('jobs').Jobs.get(draftwork.get('job_id')).get('nbr_events')
);
console.log('end1');
done();
});
});
it('triggers work:start event', function(done){
console.log('start2');
statusapp.app.bind('work:start', function(work){
work.id.should.equal(draftwork.id);
statusapp.app.off('work:start');
done();
});
이 너무 사고가 일어날 수있는,하지만 난 시험의 많음이있다, 그들은 병렬로 실행한다면, 나는 확실히 내가하지 않아도, 경쟁 조건을 가지고있다.
mocha 발행 추적기의 this issue도 참조하십시오. 그것에 따르면, 테스트는 동 기적으로 실행됩니다.
이것은 주문 된 코드가 순서대로 실행됨을 나타냅니다. 우연히 그런 일은 일어나지 않습니다. 그것이 "작동 방식"입니다. – papercowboy
정렬 된 비동기 테스트가 순서대로 실행됨을 보여줍니다. 'end1'은 항상 'start2'전에 발생합니다. 이 예제를 단순화하기 위해 첫 번째 테스트의 내용을'setTimeout (done, 1000)'으로 대체 할 수있다.그리고'before' hook을 비동기 hook로 바꾸면 첫 번째 테스트 전에 항상 실행됩니다. 제가 이해하는 바와 같이, 이것은 주제 시동기가 관심을 가졌던 행동과 동일합니다. 그리고이 행동은 적어도 현재는 기본이고 유일한 행동입니다. – skozin
나는 우리의 응용 프로그램이 같은 문제를 해결하기 위해 원 그러나 accepted answer은 우리에게 잘 작동하지 않았습니다. 특히 someCondition
에서 결코 사실이 아닐 수 있습니다.
우리는 우리의 어플리케이션에서 약속을 사용하고 이에 따라 테스트를 구조화하는 것이 매우 쉬워졌습니다. 열쇠는 그러나 before
후크를 통해 실행을 지연 여전히 :
var assert = require("assert");
describe("Application", function() {
var application = require(__dirname + "/../app.js");
var bootPromise = application.boot();
describe("#boot()", function() {
it("should start without errors", function() {
return bootPromise;
});
});
describe("#shutdown()", function() {
before(function() {
return bootPromise;
});
it("should be able to shut down cleanly", function() {
return application.shutdown();
});
});
});
최상위 스위트 ("Application")에서 비동기'before' 블록 안에 두 번째와 세 번째 코드 행 ('application = ...'및'bootPromise = ...')을 넣는 것이 좋습니다. 그렇지 않으면,이 코드에서 던져진 어떤 예외도 잡히지 않고 제대로보고되지 않으며, 더 나쁜 경우, 나머지 모든 테스트의 실행을 막을 것입니다. – skozin
사용 mocha-steps
그들이 (그들이했던 것처럼 즉 당신의 done
기능은 아직 정확하게 작동) 비동기 또는하지 않은 경우에 관계없이 테스트 순차적를 유지합니다. it
을 직접 대신 사용합니다. step
before 콜백이 while 루프에 잠겨 있다면'someCondition'은 어떻게 변할 것입니까? 이것은 JavaScript가 작동하는 방식이 아닙니다. – natevw
질문에 대한 답은 주석 행 3에 있습니다. ".. 비동기 테스트 설정 조건이 여기에 있습니다." 구체적으로는 : 비동기, 설정 조건.'before()'전에 인스턴스화되는'describe()'밖에서 범위가 지정됩니다. 이 방법으로 작동하지 않는 자바에 대한 후자의 주장은 거짓입니다. – papercowboy
! someCondition을 반복해서 확인하면서 코드가 반복적으로 멈추는 동안 다른 코드는 실행될 수 없습니다. (이벤트/타이머와 관련된 다른 모든 콜백은 실행되지 않습니다.) 이것이 작동하는 유일한 방법은 루프가 시작되기 전에 someCondition이 true로 설정된 경우입니다. 그렇지 않으면 중단됩니다. 시도 해봐. – natevw