gpt4 book ai didi

typescript - 对具有 DI 依赖项的类的 Jest

转载 作者:行者123 更新时间:2023-12-03 16:23:47 25 4
gpt4 key购买 nike

各种 Jest 文档展示了“自动”模拟、“手动”模拟或 ES6 class 的创建。模拟(在构造函数中实例化依赖项)。

但我想使用 DI/IOC 并将依赖项注入(inject)到ctor中:

// IBar.ts                                           <--- mock this
export default interface IBar {
/* ...methods... */
}

// Baz.ts <--- mock this
export default class Baz {
constructor(spam: Spam, ham: IHam) { /* ... */}
/* ...other methods... */
}

// Foo.ts <--- test this
export default class Foo {
constructor(bar: IBar, baz: Baz) { /* ... */}
/* ...other methods... */
}

所以我想在测试中这样做:
const barMock = jest.giveMeAMock("../../IBar");  // or jest.giveMeAMock<IBar>();
const bazMock = jest.giveMeAMock("./Baz"); // or jest.giveMeAMock<Baz>();
const foo = new Foo(bar, baz);

expect(foo.something()).toBe(true);

Jest 可以做到这一点吗?

(我在上面使用了一些 TypeScript 语法,但对于 JS/ES6 和 TS 来说也是同样的问题。)

最佳答案

当代码转换为 JavaScript 时,TypeScript 接口(interface)只会被编译掉......

...但是对于 class 来说绝对是可能的.

您可以使用 jest.mock 自动模拟模块和 Jest将保持模块的 API 表面相同,同时将实现替换为空 mock functions :

baz.js

export default class Baz {
doSomething() {
throw new Error('the actual function throws an error');
}
}

foo.js
export default class Foo {
constructor(baz) {
this.baz = baz;
}
doSomething() {
// ...
this.baz.doSomething();
// ...
}
}

代码.test.js
jest.mock('./baz');  // <= auto-mock the module

import Baz from './baz';
import Foo from './foo';

test('Foo', () => {
const baz = new Baz(); // <= baz is an auto-mocked instance of Baz
const foo = new Foo(baz);

foo.doSomething(); // (no error)

expect(baz.doSomething).toHaveBeenCalled(); // Success!
})

关于typescript - 对具有 DI 依赖项的类的 Jest ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55522669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com