Reactjs 当promise在其他实用方法中被内部调用时,酶测试用例失败

Reactjs 当promise在其他实用方法中被内部调用时,酶测试用例失败,reactjs,enzyme,Reactjs,Enzyme,当我对一个组件进行浅层分析时,会在componentDidMount()中调用method\u 1(),它调用一个实用工具method\u 2(),最后它会调用method\u 3(),这是一个基于承诺的请求。 它在运行npm测试时抛出以下错误 import ums from ‘user-management’; export class UmsLib{ getStatus(config, loginContext, updateLoginState) { ums.init

当我对一个组件进行浅层分析时,会在
componentDidMount()
中调用
method\u 1()
,它调用一个实用工具
method\u 2()
,最后它会调用
method\u 3()
,这是一个基于承诺的请求。 它在运行
npm测试时抛出以下错误

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);
               })
   }
}
例如: 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)
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)
    }
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);
               })
   }
}
Auth.js

import UmsLib from './umsLib'
export default class AuthService{
   init(customOptions, loginContext, updateLoginState) {
          // some code.
           UmsLib.getStatus(customOptions, loginContext, updateLoginState);
   };
}
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);
               })
   }
}
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,但似乎我在某个地方做错了什么。如有任何建议,将不胜感激

这是因为您在
catch
函数中抛出错误,导致未经处理的承诺拒绝。这正是你在控制台里看到的

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);
               })
   }
}
问题是
catch()
函数返回
Promise

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);
               })
   }
}
如果onRejected抛出错误或返回本身被拒绝的承诺,则由
catch()
返回的
承诺将被拒绝;否则,问题就解决了

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);
               })
   }
}

也有助于理解承诺链接。

Ezyme shallow是否调用componentWillMount?我认为mount调用生命周期方法而不是shallow?
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);
               })
   }
}