Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jest mock不解析每个注入值_Javascript_Unit Testing_Jestjs_Google Cloud Functions_Firebase Admin - Fatal编程技术网

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

非常感谢。我曾经误解了
类型的方法是如何工作的。这很好地解决了我的问题。谢谢!我最终使用了我的代码的公认答案,但这是一个非常平静的回答。这让我更难对这些嘲弄进行推理,我觉得这很有帮助。