即使预期不等于收到,Jest也是绿色的

时间:2018-05-15 09:51:15

标签: javascript reactjs jest redux-thunk

it('User is already present as a supplier', (done) => {
    const store = mockStore({}, [{ type: 'get_user', data: { } }]);
    return store.dispatch(userGetAction({ role: 'supplier' }, () => {})).then(() => {
      try {
        expect(store.getActions()[0].data.disabled).toEqual(true);
        expect(store.getActions()[0].data.errormessage).toEqual('User is already present as a assitantbuyer');
      } catch (err) {
        console.log(err);
      }
      done();
    }).catch(() => {
      done();
    });
  });

为什么它正在传递并显示绿色状态,即使它是预期不等于实际。

PASS  src/actions/user-get-action-assistant-buyer.test.jsx
  ● Console

    console.error node_modules/fbjs/lib/warning.js:33
    console.log src/actions/user-get-action-assistant-buyer.test.jsx:25
      { Error: expect(received).toEqual(expected)

      Expected value to equal:
        "User is already present"
      Received:
        "User is already present"
          at store.dispatch.then (/Users/prakashchandrabarnwal/Desktop/myProductInduct_CE_Admin/src/actions/user-get-action-assistant-buyer.test.jsx:23:57)
        matcherResult: 
         { actual: 'User is already present as a assitant buyer',
           expected: 'User is already present as a assitantbuyer',
           message: [Function],
           name: 'toEqual',
           pass: false } }

如果我没有包裹期望内部尝试捕捉它静静地进入.catch()

thunk代码返回UnhandledPromiseRejectionWarning:

const buyerAction = (data = {}, cb) => dispatch => axios({
  method: 'POST',
  url: `http://localhost:3001/api/manageUsers`,
  headers: {
    'x-access-token': authService.getAccessToken()
  },
  data
}).then(res => new Promise((resolve, reject) => {
  if (res.status === 200 && res.data) {
    dispatch({ type: 'buyer_created', data: res.data.message });
    if (data.role === 'buyer') {
      axios({
        method: 'POST',
        url: `http://localhost:3001/api/populateBuyerLookUp`,
        headers: {
          'x-access-token': authService.getAccessToken()
        },
        data
      })

.then((response) => {
            resolve(response);
          }).catch((err) => {
            reject(err);
          });
        }
        cb(res.data.message);
      } else {
        reject(res);
      }
    }))
      .catch(() => {
        console.log('error');
      });

(node:44182)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个错误源于在没有catch块的情况下抛出异步函数,或者拒绝未使用.catch()处理的promise。 (拒绝id:1)

1 个答案:

答案 0 :(得分:2)

因此,您的expect失败并出现错误,您捕获此错误并记录它,换句话说,您将错误静音。毕竟,你打电话给#34;完成"就像没有错误一样。 代码处理就像你写的那样:忽略并静音任何错误。您必须从测试中删除所有catch

it('User is already present as a supplier', () => {
    const store = mockStore({}, [{ type: 'get_user', data: { } }]);
    return store
       .dispatch(userGetAction({ role: 'supplier' }, () => {}))
       .then(() => {
            expect(store.getActions()[0].data.disabled).toEqual(true);
            expect(store.getActions()[0].data.errormessage).toEqual('User is already present as a assitantbuyer');
        });
  });

您可以从测试中返回Promise(不需要使用done),如果promise失败,则整个测试失败。那就是

UPD:关于UnhandledPromiseRejectionWarning,我认为它可以与您对'#pop ;BuyerLookUp"的请求相关联,这个请求完全脱离了流程。我试图修复它,但很难理解你想要做什么

    const buyerAction = (data = {}, cb) => dispatch => axios({
  method: 'POST',
  url: `http://localhost:3001/api/manageUsers`,
  headers: {
    'x-access-token': authService.getAccessToken()
  },
  data
})
  .then((res) => {
    dispatch({type: 'buyer_created', data: res.data.message});
    let promise;
    if (data.role === 'buyer') {
      promise = axios({
        method: 'POST',
        url: `http://localhost:3001/api/populateBuyerLookUp`,
        headers: {
          'x-access-token': authService.getAccessToken()
        },
        data
      });
    }

    return Promise.resolve(promise).then(() => res.data.message);
  })
  .then((message) => {
    cb(message)
  }).catch(()=>{console.log("error")});