当在其他某些Utility方法内部调用promise时,酶测试用例失败

时间:2018-06-27 07:47:07

标签: reactjs enzyme

当我处理浅层组件时,会在method_1()中调用componentDidMount()并调用实用程序method_2(),最后它会调用method_3(),这是一个基于承诺的请求。 运行npm test

时抛出以下错误

示例: Loginn.spec.js:

const wrapper = shallow(<Login />)
Error: UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)

下面给出的代码流。

Login.js:

import { AuthService } from '../../react-auth';
    componentWillMount() {

        const config = {
            environment: 'qa',
            google: true
        }

        const updateLoginState = function (isBool, currentContext) {
                currentContext.updateState('authStatusCheck', isBool);
        }

         authService.init(config, this, updateLoginState)
    }

Auth.js

import UmsLib from './umsLib'
export default class AuthService{
   init(customOptions, loginContext, updateLoginState) {
          // some code.
           UmsLib.getStatus(customOptions, loginContext, updateLoginState);
   };
}

ums.js

import ums from ‘user-management’;
export class UmsLib{
   getStatus(config, loginContext, updateLoginState) {
        ums.init(this.configOptions)
               .then(user => {
                   console.log("promise-----------------")
                   if (user && ums.isReady) {
                       return updateLoginState(true, loginContext);
                   }
               })
               .catch(error => {
                   throw Error('Failed calling UMS Library', error);
               })
   }
}

我添加了try / catch来引发所有可能的错误,并且还尝试在测试用例中处理Promise,但是似乎我在某处做错了。任何建议,将不胜感激。

1 个答案:

答案 0 :(得分:2)

这是因为您在throw Error函数中catch的情况下,导致未处理的承诺被拒绝。这正是您在控制台中得到的。

问题在于catch()函数返回PromiseFrom MDN docs

  

如果onRejected抛出错误或返回本身被拒绝的Promise,则由Promise返回的catch()被拒绝;否则,它将解决。

This SOF discussion也可以帮助理解Promise链。