Best Way to Test Promises in Jest

后端 未结 3 931
一向
一向 2020-12-11 00:32

Unless I\'m misunderstanding something, the resolves and rejects (https://facebook.github.io/jest/docs/expect.html#resolves) won\'t be available until vNext. What is the rec

相关标签:
3条回答
  • 2020-12-11 00:51

    I was able to test JEST with AXIOS for HTTP REST calls like this.

    it('has an API worth testing', async () => {
      let httpResult = null;
      await callThefunctionThatReturnsPromiseToMakeTheAxiosApiCall()
        .then(function(result) {httpResult=result;})
        .catch(function(err) {httpResult=err;});
      expect(httpResult.data.myData).toBe("myExpectedValue");
    });
    

    or

    it('has an API worth testing', async () => {
      let httpResult = await callThefunctionThatReturnsPromiseToMakeTheAxiosApiCall();
      expect(httpResult.data.myData).toBe("myExpectedValue");
    });
    
    0 讨论(0)
  • 2020-12-11 00:54

    Nowadays you can write it in this way as well: docs

    describe('Fetching', () => {
        const filters = {
            startDate: '2015-09-01'
        };
        const api = new TestApiTransport(); 
    
     it('should reject if no startdate is given', () => {
       expect.assertions(1);
       return expect(MyService.fetch()).rejects.toEqual({
         error: 'Your code message',
       });
     });          
    
    
     it('should return expected data', () => {
       expect.assertions(1);
       return expect(MyService.fetch(filters, null, api)).resolves.toEqual(extectedObjectFromApi);
     });            
    });
    

    Update (06.01.2019)

    Agree that the accepted answer doesn't work correctly as line expect.assertions(1); does all the magic. Link to docs

    expect.assertions(number) verifies that a certain number of assertions are called during a test. This is often useful when testing asynchronous code, in order to make sure that assertions in a callback actually got called.

    So putting this line at the top will control that the specific number of assertions are made by the time when the test is run.

    0 讨论(0)
  • 2020-12-11 00:59

    Either return a promise and expect in the resolve or catch

    describe('Fetching', () = > {
      const filters = {
        startDate: '2015-09-01'
      };
      const api = new TestApiTransport();
      it('should reject if no startdate is given', () = > {
        return MyService.fetch()
          .catch (e => expect(e).toBeTruthy()); // see rejects/resolves in v20+
      });
      it('should return expected data', () = > {
        return MyService.fetch(filters, null, api)
          .then(serviceObjects => {
            expect(serviceObjects).toHaveLength(2);
          })
      });
    });
    

    or using async/await

    describe('Fetching', () = > {
      const filters = {
        startDate: '2015-09-01'
      };
      const api = new TestApiTransport();
      it('should reject if no startdate is given', async() = > {
        try {
          const r = await MyService.fetch()
        } catch (e) {
          expect(e).toBeTruthy()
        }
      });
      it('should return expected data', async() = > {
        const serviceObjects = await MyService.fetch(filters, null, api)
        expect(serviceObjects).toHaveLength(2);
      });
    });
    
    0 讨论(0)
提交回复
热议问题