ElF*_*Fik 5 typescript jestjs ts-jest
我有一个像这样定义的打字稿文件:
// myType.tsx
import { Foo } from 'foo';
[...]
export interface MyType extends IDisposable {
[...]
}
export abstract class MyTypeBase implements MyType {
innerFoo: Foo | null | undefined;
get foo(): Foo {
return this.innerFoo;
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试测试另一个依赖于此的类MyType,并且我想模拟foo()吸气剂。
在我的测试文件中,将以下内容添加到文件中后:
[...]
import { MyType } from 'path/to/MyType';
[...]
jest.mock('path/to/MyType', () => {
return jest.fn().mockImplementation(() => {
return {foo: () => mockFoo}; //mockFoo is defined earlier in the file.
})
});
Run Code Online (Sandbox Code Playgroud)
运行测试时出现错误:
Class extends value undefined is not a constructor or null
仅当我包含该jest.mock(...)行时才会发生这种情况。
从其他相关问题来看,我认为这可能是由循环依赖引起的,但我看不出这是如何通过调用jest.mock? 我可以看到当我注释掉此代码时遇到的其他断点没有被命中,因此看起来添加此模拟会导致我的测试因这个原因提前失败。
有人以前遇到过这个吗?
该问题在文档中进行了解释:
工厂参数的一个限制是,由于对 jest.mock() 的调用被提升到文件的顶部,因此不可能首先定义变量然后在工厂中使用它。以“mock”一词开头的变量是一个例外。由您来保证它们将按时初始化!例如,由于在变量声明中使用“fake”而不是“mock”,以下内容将引发超出范围的错误
使用mockFoo变量名可以在工厂函数中使用它jest.mock,风险由您自行承担。
mockFoo 在文件的前面定义
这不是真的,因为jest.mock在各自的导入之上提升,但它引用的变量在评估模拟模块时未定义。对于热切评估的模拟模块,需要在工厂内定义模拟。如果需要在测试中访问它,可以通过模块公开它。
foo是属性访问器,但被模拟为函数。
模拟模块也是 CommonJS,这将阻止命名导入在大多数设置中正确映射,__esModule: true模拟模块中应该有。
| 归档时间: |
|
| 查看次数: |
14415 次 |
| 最近记录: |