如何修复TypeError不是一个函数(使用Jest测试promise) [英] How to fix TypeError is not a function (testing promises with Jest)
本文介绍了如何修复TypeError不是一个函数(使用Jest测试promise)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我现在有一个通过测试,感谢答案:
测试
jest.mock('services / firebase',()=>新承诺(resolve => resolve({
signInWithEmailAndPassword: ()=> Promise.resolve({getIdToken:'abc123'}),
getIdToken :()=> jest.fn(),
signOut :()=> jest.fn()
})));
describe('login actions',()=> {
let store;
beforeEach(()=> {
store = mockStore({});
});
it('signIn应该调用firebase',()=> {
const user = {
email: 'first.last@yum.com',
密码:'abd123'
};
返回store.dispatch(signIn(user.email,user.password))
.then(()=> {
console.log('TEST signIn SUCCESS');
expect(mockSignIn).toHaveBeenCalled();
expect(store.getActions( ))。toEqual({
类型:USER_ON_LOGGED_IN
});
})
.catch((err)=> {
console.log('TEST signIn ERROR =>',err);
});
});
SignIn操作/登录
//登录操作
导出const signIn =(电子邮件,密码, redirectUrl = ROUTEPATH_DEFAULT_PAGE)=>(dispatch)=> {
dispatch({类型:USER_LOGIN_PENDING});
返回firebase
.then((auth)=> {
console.log('auth =>',auth);
返回auth.signInWithEmailAndPassword (电子邮件,密码);
})
.catch((e)=> {
console.error('actions / Login / signIn',e);
/ /注册一个新用户
if(e.code === LOGIN_USER_NOT_FOUND){
dispatch(push(ROUTEPATH_FORBIDDEN));
dispatch(toggleNotification(true,e.message,'error') );
} else {
dispatch(displayError(true,e.message));
setTimeout(()=> {
dispatch(displayError(false,'')) );
},5000);
抛出e;
}
})
//我似乎无法正确模仿这个
.then(res => res.getIdToken())
.then((idToken)=> {
if(!idToken){
dispatch(displayError(true,')抱歉,获取令牌存在问题。'));
}
讯(onCheckAuth(电子邮件));
dispatch(push(redirectUrl));
});
};
解决方案
这看起来就像是你得到这个的原因错误与您通过Jest嘲笑的数据有关。
尝试模拟您的 getIdToken
作为函数,而不是字符串:
const mockGetIdToken =()=> ABC123’ ;
jest.mock('services / firebase',()=>新承诺(resolve => resolve({
signInWithEmailAndPassword :()=> Promise.resolve({getIdToken :mockGetIdToken}),
getIdToken:mockGetIdToken,
signOut :()=> jest.fn()
})));
describe('login actions',()=> {
let store;
beforeEach(()=> {
store = mockStore({});
});
it('signIn应该调用firebase',()=> {
const user = {
email: 'first.last@yum.com',
密码:'abd123'
};
返回store.dispatch(signIn(user.email,user.password))
.then(()=> {
console.log('TEST signIn SUCCESS');
expect(mockSignIn).toHaveBeenCalled();
expect(store.getActions( ))。toEqual({
类型:USER_ON_LOGGED_IN
});
})
.catch((err)=> {
console.log('TEST signIn ERROR =>',err);
});
});
I have a passing test now thanks to the answer here: How to test is chained promises in a jest test?
However I'm still getting an error in the catch part of my test.
I seem to not be able to correctly mock or spy this part in the actions file: .then(res => res.getIdToken())
TEST signIn ERROR => TypeError: res.getIdToken is not a function
The Test
jest.mock('services/firebase', () => new Promise(resolve => resolve({
signInWithEmailAndPassword: () => Promise.resolve({ getIdToken: 'abc123' }),
getIdToken: () => jest.fn(),
signOut: () => jest.fn()
})));
describe('login actions', () => {
let store;
beforeEach(() => {
store = mockStore({});
});
it('signIn should call firebase', () => {
const user = {
email: 'first.last@yum.com',
password: 'abd123'
};
return store.dispatch(signIn(user.email, user.password))
.then(() => {
console.log('TEST signIn SUCCESS');
expect(mockSignIn).toHaveBeenCalled();
expect(store.getActions()).toEqual({
type: USER_ON_LOGGED_IN
});
})
.catch((err) => {
console.log('TEST signIn ERROR =>', err);
});
});
The SignIn actions/Login
// Sign in action
export const signIn = (email, password, redirectUrl = ROUTEPATH_DEFAULT_PAGE) => (dispatch) => {
dispatch({ type: USER_LOGIN_PENDING });
return firebase
.then((auth) => {
console.log('auth =>', auth);
return auth.signInWithEmailAndPassword(email, password);
})
.catch((e) => {
console.error('actions/Login/signIn', e);
// Register a new user
if (e.code === LOGIN_USER_NOT_FOUND) {
dispatch(push(ROUTEPATH_FORBIDDEN));
dispatch(toggleNotification(true, e.message, 'error'));
} else {
dispatch(displayError(true, e.message));
setTimeout(() => {
dispatch(displayError(false, ''));
}, 5000);
throw e;
}
})
// I can't seem to mock this correctly
.then(res => res.getIdToken())
.then((idToken) => {
if (!idToken) {
dispatch(displayError(true, 'Sorry, there was an issue with getting your token.'));
}
dispatch(onCheckAuth(email));
dispatch(push(redirectUrl));
});
};
解决方案
It looks like the reason why you're getting this error has to do with the data you're mocking through Jest.
Try mocking your getIdToken
as a function, rather than a string:
const mockGetIdToken = () => 'abc123';
jest.mock('services/firebase', () => new Promise(resolve => resolve({
signInWithEmailAndPassword: () => Promise.resolve({ getIdToken: mockGetIdToken }),
getIdToken: mockGetIdToken,
signOut: () => jest.fn()
})));
describe('login actions', () => {
let store;
beforeEach(() => {
store = mockStore({});
});
it('signIn should call firebase', () => {
const user = {
email: 'first.last@yum.com',
password: 'abd123'
};
return store.dispatch(signIn(user.email, user.password))
.then(() => {
console.log('TEST signIn SUCCESS');
expect(mockSignIn).toHaveBeenCalled();
expect(store.getActions()).toEqual({
type: USER_ON_LOGGED_IN
});
})
.catch((err) => {
console.log('TEST signIn ERROR =>', err);
});
});
这篇关于如何修复TypeError不是一个函数(使用Jest测试promise)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文