Javascript Jest mock不解析每个注入值
我正在尝试在我的Javascript Jest mock不解析每个注入值,javascript,unit-testing,jestjs,google-cloud-functions,firebase-admin,Javascript,Unit Testing,Jestjs,Google Cloud Functions,Firebase Admin,我正在尝试在我的functions/send.js模块中测试名为myCloudFn的Firebase云函数。我的测试在functions/test/send.spec.js中: //send.js const admin=require('firebase-admin'); 异步函数myCloudFn(电子邮件){ const authUser=wait admin.auth().getUserByEmail(电子邮件); 返回authUser; } module.exports={myClou
functions/send.js
模块中测试名为myCloudFn
的Firebase云函数。我的测试在functions/test/send.spec.js
中:
//send.js
const admin=require('firebase-admin');
异步函数myCloudFn(电子邮件){
const authUser=wait admin.auth().getUserByEmail(电子邮件);
返回authUser;
}
module.exports={myCloudFn};
//send.spec.js
const send=require('../send.js');
jest.mock('firebase-admin',()=>({
作者:()=>({
getUserByEmail:jest.fn()
.mockResolvedValueOnce({uid:'foo-bar'})
.mockResolvedValueOnce(null),
}),
}));
描述('send.js',()=>{
它('从myCloudFn()返回authUser',异步()=>{
常数电子邮件foo@bar.com';
const responseOptions=[{uid:'foo-bar'},null];
const responsePromises=responseOptions.map(()=>send.myCloudFn(email));
const responses=wait Promise.all(responsePromises);
expect(responses[0])to tricteQual(responseOptions[0]);
expect(responses[1])to tricteQual(responseOptions[1]);
});
});
测试通过了第一个断言,但第二个断言失败。测试两次都返回相同的
{uid:'foo bar'}
对象,但我希望测试响应值第二次为null
。我缺少什么?在每次auth
调用时都会创建一个新的getUserByEmail
spy,它不会被多次调用
相反,它应该是:
const mockGetUserByEmail = jest.fn();
jest.mock('firebase-admin', () => ({
auth: () => ({
getUserByEmail: mockGetUserByEmail
})
}));
...
mockGetUserByEmail
.mockResolvedValueOnce({ uid: 'foo-bar' })
.mockResolvedValueOnce(null);
const responsePromises = responseOptions.map(() => send.myCloudFn(email));
...
您可以为每个测试用例模拟一次
getUserByEmail
方法的解析值
例如
send.js
:
const admin=require('firebase-admin');
异步函数myCloudFn(电子邮件){
const authUser=wait admin.auth().getUserByEmail(电子邮件);
返回authUser;
}
module.exports={myCloudFn};
send.test.js
:
const{myCloudFn}=require('./send');
const admin=require('firebase-admin');
开玩笑(
“firebase管理员”,
() => {
常数mAdmin={
auth:jest.fn().mockReturnThis(),
getUserByEmail:jest.fn(),
};
返回mAdmin;
},
{virtual:true},
);
描述('send.js',()=>{
毕竟(()=>{
jest.resetAllMocks();
});
它('应该从myCloudFn()返回authUser',async()=>{
admin.auth().getUserByEmail.mockResolvedValueOnce({uid:'foo bar'});
const实际值=等待myCloudFn();
expect(实际).toEqual({uid:'foobar'});
});
它('应该返回null',async()=>{
admin.auth().getUserByEmail.mockResolvedValueOnce(null);
const实际值=等待myCloudFn();
expect(实际).toBeNull();
});
});
单元测试结果:
PASS src/stackoverflow/64575307/send.test.js (14.349s)
send.js
✓ should returns authUser from myCloudFn() (11ms)
✓ should return null (3ms)
----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
send.js | 100 | 100 | 100 | 100 | |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 17.321s
非常感谢。我曾经误解了
类型的方法是如何工作的。这很好地解决了我的问题。谢谢!我最终使用了我的代码的公认答案,但这是一个非常平静的回答。这让我更难对这些嘲弄进行推理,我觉得这很有帮助。