有条不紊地运行带或不带嘲笑的测试

时间:2017-10-04 16:59:52

标签: javascript unit-testing ecmascript-6 jestjs

我正在使用模拟运行测试,以便测试不会总是命中API。然而,我还想添加一个条件,以便我可以使用相同的测试来测试API。

但是当我添加条件时,无论条件是真还是假,它都会忽略它并且永远不会应用模拟。

{
    "shell_cmd": "javac $file_name && java $file_base_name",
    "working_dir": "${project_path:${folder}}",
    "selector": "source.java"
}

两个问题:

  1. 有关如何添加条件模拟的任何想法?我认为模拟从不适用,因为在进行任何导入之前可能需要调用import config from 'config'; if(!config.test.useNetwork) { jest.mock('api/companies'); jest.mock('api/articles'); } import { searchCompany } from 'api/companies'; ... 吗?
  2. 通过网络进行测试的惯例是什么?如果我只是使用模拟,我真的只是测试模拟,而不是网络请求代码。但是,如果我不使用模拟,我就会不必要地使用API​​。

2 个答案:

答案 0 :(得分:2)

一:

是的,jest.doMock"hoisted to the top of the code block"。但是,const config = require('./config').default; if(!config.test.useNetwork) { jest.doMock('api/companies'); jest.doMock('api/articles'); } const { searchCompany } = require('api/companies'); 未被提升。所以,你可以实现你想要的东西:

sumUpToFirst3

二:

这是一个有争议的问题。它不适合StackOverflow而且我没有触及它lol

答案 1 :(得分:0)

我有一个类似的问题that I have answered for myself,找到了另一个解决方案。

您可以使用第二个参数(工厂)来决定要返回模拟还是实际模块

import config from 'config';
import { searchCompany } from 'api/companies';

jest.mock('api/companies', () => {
  if(!config.test.useNetwork) return jest.genMockFromModule('api/companies');
  return jest.requireActual('api/companies');
});