Как сделать обещание быть отклоненным в Jest Manual Mock - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть компонент, который после монтирования вызывает функцию для получения данных из 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);
});
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...