微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

开玩笑的模拟无法解决每个注入的值

如何解决开玩笑的模拟无法解决每个注入的值

我正在尝试在我的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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?