如何解决开玩笑的模拟无法解决每个注入的值
我正在尝试在我的myCloudFn
模块中测试名为functions/send.js
的Firebase云功能。我的测试在functions/test/send.spec.js
中:
// send.js
const admin = require('firebase-admin');
async function myCloudFn (email) {
const authUser = await admin.auth().getUserByEmail(email);
return authUser;
}
module.exports = { myCloudFn };
// send.spec.js
const send = require('../send.js');
jest.mock('firebase-admin',() => ({
auth: () => ({
getUserByEmail: jest.fn()
.mockResolvedValueOnce({ uid: 'foo-bar' })
.mockResolvedValueOnce(null),}),}));
describe('send.js',() => {
it('returns authUser from myCloudFn()',async () => {
const email = 'foo@bar.com';
const responSEOptions = [{ uid: 'foo-bar' },null];
const responsePromises = responSEOptions.map(() => send.myCloudFn(email));
const responses = await Promise.all(responsePromises);
expect(responses[0]).toStrictEqual(responSEOptions[0]);
expect(responses[1]).toStrictEqual(responSEOptions[1]);
});
});
测试在第一个断言上通过,但在第二个断言上失败。测试两次都返回相同的{ uid: 'foo-bar' }
对象,但我希望第二次返回测试响应值null
。我想念什么?
解决方法
每次getUserByEmail
调用都会创建一个新的auth
间谍,但不会被多次调用。
它应该是:
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');
async function myCloudFn(email) {
const authUser = await admin.auth().getUserByEmail(email);
return authUser;
}
module.exports = { myCloudFn };
send.test.js
:
const { myCloudFn } = require('./send');
const admin = require('firebase-admin');
jest.mock(
'firebase-admin',() => {
const mAdmin = {
auth: jest.fn().mockReturnThis(),getUserByEmail: jest.fn(),};
return mAdmin;
},{ virtual: true },);
describe('send.js',() => {
afterAll(() => {
jest.resetAllMocks();
});
it('should returns authUser from myCloudFn()',async () => {
admin.auth().getUserByEmail.mockResolvedValueOnce({ uid: 'foo-bar' });
const actual = await myCloudFn();
expect(actual).toEqual({ uid: 'foo-bar' });
});
it('should return null',async () => {
admin.auth().getUserByEmail.mockResolvedValueOnce(null);
const actual = await myCloudFn();
expect(actual).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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。