2016-03-25 7 views
0

Я застрял в написании модульных тестов для своего кода, который использует обещания rsvp. Я пытался использовать pit тесты, но не везло в создании тесты пройдены для RSVP, однако встроенные обещания работать нормально:Невозможно протестировать обещания rsvp в шутке

//jest.autoMockOff(); - even with this rsvp test is failing 
jest.unmock('rsvp'); 

import rsvp from 'rsvp'; 

describe('my rsvp tests',() => { 

    // this test fails 
    pit('testing rsvp promise',() => { 
    return new rsvp.Promise((resolve) => { 
     resolve("getting something"); 
    }).then(()=> { expect(1).toBe(1); }); 
    }); 

    // this test passes 
    pit('testing pure promise',() => { 
    return new Promise((resolve) => { 
     resolve("getting something"); 
    }).then(()=> { expect(1).toBe(1); }); 
    }); 
}); 

Соответствующие детали от моего package.json:

"rsvp": "^3.2.1", 
"babelify": "^7.2.0", 
"babel-preset-es2015": "^6.6.0", 
"babel-preset-react": "^6.5.0", 
"babel-preset-stage-0": "^6.5.0", 
"babel-jest": "^9.0.0", 
"jest-cli": "*" 
... 
"scripts": { 
    "test": "jest" 
}, 

"jest": { 
    "unmockedModulePathPatterns": [ 
    "<rootDir>/node_modules/react", 
    "<rootDir>/node_modules/react-dom", 
    "<rootDir>/node_modules/react-addons-test-utils" 
    ] 
} 

.babelrc:

{ 
    "presets": ["es2015", "react", "stage-0"] 
} 

Я вижу два возможных путей их устранения, но, как ни один из них:

  1. Мощное обещание rsvp с использованием встроенных обещаний. Недостаток: модульные тесты станут более подробными, мне нужно будет высмеять другие функции, такие как rsvp.all, которые я не хочу делать.
  2. Миграция с rsvp на встроенные обещания. Возможно, однако я уже использую одну библиотеку, которая зависит от rsvp, которая делает запросы ajax. Я также не уверен, что встроенные обещания могут заменить все, что предоставляет rsvp (например, «все» и другие вспомогательные функции).

ответ

0

Я нашел решение - или, вернее сказать, обходное решение. Короче говоря, нет необходимости использовать методы ямы, их можно заменить на «это», но перед завершением все таймеры должны быть запущены, это можно сделать, вызвав jest.runAllTimers().

Это не изящное решение, поскольку я не вижу причин, по которым обещания rsvp не должны работать в шутку, а не в «встроенных», но, по крайней мере, это работает.

+0

Возможно, вы должны указать ошибку? – Laurent