【问题标题】:Manual mocking using __mocks__ not working使用 __mocks__ 手动模拟不起作用
【发布时间】:2019-08-29 11:02:49
【问题描述】:

我正在尝试向我正在开发的节点应用程序添加一些测试。我浏览了手动模拟的笑话文档,并尝试按照指示创建 mocks 文件夹。请在下面找到文件夹结构。

app
 - firebase
  - fb.js
  - __mocks__
    - fb.js
    - firebase-admin.js
 - resolvers
    - mutation.js
__tests__
 - user.spec.js

如您所见,我尝试模拟两个模块,fb.js(用户模块)和 firebase-admin.js(node_modules 模块)。 firebase-admin.js 模拟工作没有任何问题。但是用户模块模拟甚至没有被开玩笑所接受。实际的 fb.js 模块一直在被调用。

我尝试为我的项目中的各种用户模块创建 mocks 目录,但没有一个被选中。有没有我遗漏的额外配置???。目前我正在通过仅模拟 firebase-admin 节点模块来解决这个问题。但我想模拟用户模块而不是 firebase-admin 模块,以便我的 firebase 配置也被模拟。如果需要更多信息,请告诉我。

__mocks__/fb.js

module.exports = {
   auth: jest.fn(() => "testing")
};

__mocks__/fb-admin.js

module.exports = {};

__tests__/user.spec.js

const request = require('supertest');
const server = require('../app').createHttpServer({});

const app = request(server);

describe('login resolvers', () => {
  test('should sign up user', async () => {
    const response = await app.post('/')
      .send({
        query: `mutation {
          signUp(idToken: "esd45sdfd...") {
            user {
              id
              locked
              revoked
            }
          }
        }
        `,
      })
      .set('Accept', 'application/json')
      .expect(200);
    console.log(response.text);
  });
});

app/resolvers/mutation.js

const admin = require('../firebase/fb');

/* other app code here */

【问题讨论】:

    标签: javascript node.js jes


    【解决方案1】:

    我必须非常仔细地阅读文档。特别是关于"unless you configured roots to point to a folder other than the project root"的部分。仔细检查您是否在为 Jest 指定的源文件夹中设置了 __mocks__ 文件夹。

    【讨论】:

      【解决方案2】:

      来自the docs on Manual Mocks

      当我们在测试中需要该模块时,需要显式调用jest.mock('./moduleName')

      如果您要模拟的模块是 Node 模块(例如:lodash),则模拟应放置在与 node_modules 相邻的 __mocks__ 目录中(除非您将根配置为指向除项目根目录)并将自动模拟。 无需显式调用jest.mock('module_name')

      【讨论】:

      • 谢谢。我的测试中不需要模拟模块。它在执行测试代码时在内部使用。所以根据文档,不需要明确的 jest.mock ,对吧?
      • 没有。您需要告诉 jest 在 sut 需要时模拟模块
      • 这是一个非常令人困惑的对话阅读。从答案:“没有必要显式调用 jest.mock('module_name')。” -> 评论:“明确的 jest.mock 不是必需的,对吧?” -> 下一条评论:“不。你需要告诉 jest 模拟模块”。
      • 我处于同样的情况,我在测试中不需要模拟模块,但它正在内部使用。调用 jest.mock('module_name') 不会从 __mocks__ 拉取模块。但将其排除在外也无济于事。我还有哪些其他选择?
      • 玛丽安娜。 '没有必要...' 当一个节点模块。该操作正在询问用户模块(不是节点模块),因此是必需的。
      猜你喜欢
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      相关资源
      最近更新 更多