У меня есть компонент, который после монтирования вызывает функцию для получения данных из pouchdb.У меня есть драйвер / фасад, который использует API pouchdb для получения этих данных после синхронизации с удаленной базой данных.Теперь для моего теста я предоставил ручной макет, чтобы я мог смоделировать результат / ответ, чтобы избежать непосредственного использования pouchdb.Это работает нормально, но теперь я хочу протестировать блок отклонения, и так как мой ручной макет всегда решает, я узнаю, как протестировать эту часть.Вот мой тест:
Код компонента
// getData gets called in componentDidMount
public getData() {
// The test will use the mock implementation which returns a
// resolved promise
this.driver.getData().then(
(sessions: Session[]) => {
this.setState({
dataSource: this.state.dataSource.cloneWithRows(sessions),
didSync: true,
sessions: sessions
});
},
// How can I force my mock implementation to reject the promise so
// I can test this block ?
error => {
// Send a log error to a backend API
this.setState({ didSync: false });
}
);
}
Тест
// This uses the mock implementation which returns a promise
jest.mock("../../../modules/pouchdb/WebDriver");
let wrapper: ShallowWrapper | ReactWrapper;
let instance;
// This is the response my mock driver returns
const data = SessionsQAResponseMock.getSessionsResponse();
describe('My Component Tests', () => {
beforeEach(() => {
wrapper = shallow(<AttendeesHomeComponent userRole={Roles.Attendee}
/>);
instance = wrapper.instance();
expect(wrapper).toMatchSnapshot();
});
// This tests works (Successful Promise)
it('Tests Resolves Promise', done => {
const emptyContent = wrapper.find(EmptyContentComponent);
expect(emptyContent.exists()).toBeTruthy();
expect(instance.state.didSync).toBeFalsy();
expect(instance.state.sessions).toEqual([]);
setTimeout(() => {
// Webdriver resolves
expect(instance.state.didSync).toBeTruthy();
expect(instance.state.sessions).toEqual(data);
// After we got data our component should display a ListView
const listView = wrapper.find(ListView);
expect(listView.exists()).toBeTruthy();
// We're done testing
done();
}, 0);
});
// This test fails. The mock is still resolving the promise. and the
// states updates to {dydSync: true}
it("Test Error Block", done => {
// driver is an instance variable
instance.driver.getSessions = jest.fn()
.mockReturnValue(Promise.reject({ error: "Failed" }));
setTimeout(() => {
// expect(instance.state.sessions).toEqual([]);
expect(instance.state.didSync).toBeFalsy();
done();
}, 0);
});
})