2017-05-15 2 views
0

저는 모카와 테스트를하고있는 직원이 있습니다. 그러나 약속 된 해결책에서 적절한 응답을 얻었음에도 불구하고, 모카는 시간 초과로 인해 시험에 실패합니다. 중요한 사실은 그것이 모카 시간 초과 후 해결된다는 것입니다.모카 타임 아웃 후 약속을 지키십시오.

import chai, { expect } from 'chai'; 
// Needed otherwise Worker is undefined in the test environment 
const Worker = require('webworker-threads').Worker; 

describe('WebWorker',() => { 
    it('should return correctly',() => { 
    return new Promise(res => { 
     const dummyWorker = new Worker('./public/js/worker.bundle.js'); 

     dummyWorker.onmessage = e => { 
     console.log('test message'); // 'test message' prints to testing log 
     res(e.data); 
     }; 

     dummyWorker.postMessage(['foo', 'bar']); 
    }) 
    .then(workerData => { 
     console.log(workerData[0]); // 'foo' prints to testing log 
     expect(workerData[0]).to.equal('foo'); 
    }) 
    .catch(err => console.error(err)); 
    }); 
}); 

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

내가 사용, before() 후크를 사용하여, done()를 사용 모든 일부 순열을 시도했습니다 차이 - 약속 - 제한 시간을 증가 this.timeout(5000)를 사용하여, 약속과 모카의 완료를 사용하고, 온 에,하지만 아무것도 작동하는 것 같습니다.

+0

당신은 모카의 제한 시간을 연장해야한다. 'it' arrow 함수를 정규 함수로 다시 쓰고'this.timeout (5000)'의 첫번째 줄을 추가하십시오. 이렇게하면 모카는 적어도 5 초 동안 기다렸다가 불평을합니다. – MarcoL

+0

@MarcoL 안녕하십니까. 나는 실제로 그것도 시도했지만, 시도한 것들의 목록에 그것을 잊어 버렸다. 나는 지금 목록을 업데이트 할 것이다. – mythereal

+0

당신은 약속을 되 돌리므로, 모카는 그 약속이 올바르게 풀릴 때까지 기다려야합니다. 이것은'dummyWorker.onmessage (...)'가 절대로 호출되지 않는다는 것을 강하게 암시합니다. './public/js/worker.bundle.js'가하고있는 것을 게시 할 수 있습니까? –

답변

1

npm 패키지 webworker-threads에이 문제의 범위가 좁혀졌습니다. 그리고 당신은 무엇을 알고 있습니다. 사실 아직 해결되지 않은 issue입니다.

약속이 포함될 때만 문제가됩니다. 나는 dummyWorker.onmessage의 안에서 done()를 사용하려고 노력했다. 그러나 나는 슬프게 실수했다. webworker-threads와 함께 done()을 사용하면 문제가 없습니다. 그러나 done()을 사용할 때의 문제점은 모든 어설 션 오류가 시간 초과 메시지 만 반환한다는 것입니다. 약속과 함께, 오류 메시지는 훨씬 더 구체적입니다.

따라서 저는 다른 웹 작업자 패키지 인 작은 작업자를 사용하도록 전환했으며 현재는 잘 작동합니다. 당신이 webworker - 스레드 문제를 참조 외부 파일을 필요없이 오류를 재현 아래의 간단한 예를 참조 할 이벤트에서

는 :

import { expect } from 'chai'; 
const Worker = require('webworker-threads').Worker; 

describe('web worker',() => { 
    it('should resolve',() => { 
    const p = new Promise(resolve => { 
     const dummyWorker = new Worker(function() { 
     this.onmessage = e => { 
      self.postMessage('foo'); 
     }; 
     }); 

     dummyWorker.onmessage = e => { 
     resolve(e.data); 
     }; 
     dummyWorker.postMessage('foo'); 
    }); 

    return p.then(data => { 
     console.log(data)); 
     expect(data).to.equal('bar'); 
    } 
    }); 
});