У меня есть знания TDD, и я пытался запустить проект в javascript, используя те же принципы.
Я создаю API, который, при попадании, запускает запрос к внешней службе, чтобычтобы собрать некоторые данные и, после получения, проанализировать их и вернуть ответ.
До сих пор мне не повезло с сагой, я много искал и самую похожую проблему в SOнашел это один . Но я не добился успеха в применении того же решения.
Моя реализация на стороне реализации выглядит следующим образом:
//... other handlers
weather(request, response) {
//... some setup and other calls
this.externalService.get(externalURL)
.then(serviceResponse => {
this.externalResponseParser.parse(serviceResponse)
});
//... some more code
}
И на стороне теста:
let requester;
let mockParser;
let handler;
let promiseResolve;
let promiseReject;
beforeEach(function () {
requester = new externalRequesterService();
mockParser = sinon.createStubInstance(...);
handler = new someHandler({
externalService: requester,
externalResponseParser: mockParser
});
});
it('returns data', function () {
sinon.stub(requester, 'get').callsFake((url) => {
return new Promise((resolve, reject) => {
// so I can be able to handle when the promise gets resolved
promiseResolve = resolve;
promiseReject = reject;
});
});
handler.weather(request, response);
// assertions of what happens before externalService.get gets called - all green
promiseResolve(expectedServiceResponse);
assert.ok(mockExternalResponseParser.parse.calledOnce, 'Expected externalResponseParser.parse to have been called once');
});
В последней строке теста он не проходит, хотя я и называю то, что должен. В какой-то момент я добавил журналирование и смог увидеть, что код блока then
, похоже, выполняется после утверждения в тесте, что может быть источником проблемы.
Я пытался выяснить, есть ли какой-нибудь eventually
, который можно использовать, поэтому мое утверждение после выполнения обещания будет выглядеть примерно так:
assert.eventually(mockExternalResponseParser.parse.calledOnce, 'Expected externalResponseParser.parse to eventually be called once');
, но не повезло.
У кого-нибудь есть четкое объяснение того, чего не хватает? Большое спасибо заранее
PS - По запросу, пожалуйста, найдите урезанную версию моего кода здесь . Просто запустите npm install
, а затем npm test
, чтобы получить тот же вывод.