如何使用 Jest 测试导入/导出?
Posted
技术标签:
【中文标题】如何使用 Jest 测试导入/导出?【英文标题】:How to test imports/exports with Jest? 【发布时间】:2019-06-09 23:56:56 【问题描述】:这是我的结构:
如您所见,我对文件 shipments.js
有 100% 的测试覆盖率,这些测试如下:
import shipmentsPagination,
setFilters,
removeFilter,
toggleFiltersModal,
setCSVDataAction,
from '../../actions/shipments';
describe('shipments redux actions', () =>
it('should test setCSVDataAction', () =>
const result = setCSVDataAction(
itemsCount: 0,
shipments: [],
);
expect(result.type).toEqual('SET_CSV_DATA');
expect(result.payload).toEqual(
shipmentsCSV:
itemsCount: 0,
shipments: [],
,
);
);
it('should test toggleFiltersModal', () =>
const result = toggleFiltersModal(true);
expect(result.type).toEqual('TOGGLE_SHIPMENTS_FILTERS_MODAL');
);
it('should test removeFilter', () =>
const filters =
shipmentId: '123',
status: 'received',
carrier: 'FedEx',
shippedFrom: 'Dallas',
shippedTo: 'NY',
shippedDate: '10/13/2018',
shipmentType: 'Colocation Hardware',
;
const result = removeFilter(filters);
expect(result.type).toEqual('REMOVE_SHIPMENTS_FILTER');
expect(result.payload).toEqual( [filters]: '' );
);
it('should test shipmentsPagination', () =>
const result = shipmentsPagination(
page: 2,
pageSize: 25,
);
expect(result.type).toEqual('UPDATE_SHIPMENTS_PAGINATION');
expect(result.payload).toEqual( page: 2, pageSize: 25 );
);
it('should test setFilters', () =>
const result = setFilters(
shipmentId: '123',
status: 'Received',
carrier: 'FedEx',
shippedFrom: 'Houston - HOU02',
shippedTo: 'Herp',
shippedDate: '1/24/2019',
shipmentType: 'Colocation Hardware',
);
expect(result.type).toEqual('SET_SHIPMENTS_FILTERS');
expect(result.payload).toEqual(
shipmentId: '123',
status: 'Received',
carrier: 'FedEx',
shippedFrom: 'Houston - HOU02',
shippedTo: 'Herp',
shippedDate: '1/24/2019',
shipmentType: 'Colocation Hardware',
);
);
);
如您所见,index.js
在第 1 行没有覆盖范围。
index.js
是这个:
import shipments from './shipments';
export default
shipments,
;
那么我如何测试导入/导出以获得 100% 的测试覆盖率?
【问题讨论】:
强制性“100% 的覆盖率本身并不是一个目标,您可以别管它”评论 :) 不是答案,但是:您可以简单地忽略覆盖率计算中的 index.js 【参考方案1】:从我所看到的代码中,只需在测试中从index.js
导入shipmentsPagination
:
import defaultExport from '../../actions/'; // import the default export from index.js
const shipments: shipmentsPagination = defaultExport; // and use it to get shipmentsPagination
import
setFilters,
removeFilter,
toggleFiltersModal,
setCSVDataAction,
from '../../actions/shipments'; // everything else can come from shipments.js
从index.js
导入shipmentsPagination
将确保index.js
中的export
行得到测试。
【讨论】:
【参考方案2】:@mystackrunnethover 是对的,并不完全需要覆盖该行,但是,以防万一:
我将这些测试用作“健全性测试”,以确保 Jest 正常运行。
一个常见的陷阱是假设如果导入失败,imported_thing.toBeTruth()
将失败。它不会 - imported_thing
将是一个空对象,这是真的。
这是我们使用的:
import Account from '/account';
//describe block
expect(Account).toBeTruthy();
expect(Object.keys(Account).length > 0).toBe(true);
当然,这仅适用于Account
实际具有属性(并且应该具有)的情况。另一种方法是专门检查您期望的属性。
【讨论】:
我按照你说的做了,现在我得到了这个:monosnap.com/file/oKNvsgI9SdIdaKyBUrXBz65L6Z7jTV 这太令人困惑了。 我不知道那是什么,抱歉。以上是关于如何使用 Jest 测试导入/导出?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Jest 测试导入自定义原生模块的 React Native 组件?
如何在 Jest 测试中使用我的 webpack 的 html-loader 导入?
jest.mock():如何使用工厂参数模拟 ES6 类默认导入