我试图Mailer用jest 模拟一个类,我无法弄清楚如何去做.文档没有提供很多关于它如何工作的例子.过程是我将password-reset触发一个节点事件,当该事件被触发时,我想使用发送电子邮件Mailer.send(to, subject, body).这是我的目录结构:
project_root
-- __test__
---- server
------ services
-------- emails
---------- mailer.test.js
-- server
---- services
------ emails
-------- mailer.js
-------- __mocks__
---------- mailer.js
Run Code Online (Sandbox Code Playgroud)
这是我的模拟文件__mocks__/mailer.js:
const Mailer = jest.genMockFromModule('Mailer');
function send(to, subject, body) {
return { to, subject, body };
}
module.exports = Mailer;
Run Code Online (Sandbox Code Playgroud)
和我的 mailer.test.js
const EventEmitter = require('events');
const Mailer = jest.mock('../../../../server/services/emails/mailer');
test('sends an email when the password-reset event is fired', () => {
const send = …Run Code Online (Sandbox Code Playgroud) 我想在我的测试文件中模拟我的ES6类导入.
如果被模拟的类有多个使用者,那么将模拟移动到__mocks__可能是有意义的,这样所有测试都可以共享模拟,但在此之前我想将模拟保留在测试文件中.
jest.mock()可以模拟导入的模块.传递单个参数时:
jest.mock('./my-class.js');
Run Code Online (Sandbox Code Playgroud)
它使用与模拟文件相邻的__mocks__文件夹中的模拟实现,或创建自动模拟.
jest.mock()采用第二个参数,它是模块工厂函数.对于使用导出的ES6类export default,不清楚此工厂函数应该返回什么.是吗:
default是返回模仿类实例的对象的函数?文档很模糊:
第二个参数可用于指定正在运行的显式模块工厂,而不是使用Jest的自动锁定功能:
我正在努力想出一个工厂定义,当消费者import是班级时,它可以作为构造函数.我一直在TypeError: _soundPlayer2.default is not a constructor(例如).
我试过避免使用箭头函数(因为它们不能被调用new)并让工厂返回一个具有default属性(或不具有)的对象.
这是一个例子.这不起作用; 所有的测试都扔了TypeError: _soundPlayer2.default is not a constructor.
正在测试的类: sound-player-consumer.js
import SoundPlayer from './sound-player'; // Default import
export default class SoundPlayerConsumer {
constructor() {
this.soundPlayer = new SoundPlayer(); //TypeError: _soundPlayer2.default is not a constructor
} …Run Code Online (Sandbox Code Playgroud) 各种 Jest 文档展示了“自动”模拟、“手动”模拟或ES6 类模拟(在构造函数中实例化依赖项)的创建。
但是我想使用 DI / IOC 并将依赖项注入到 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... */
}
Run Code Online (Sandbox Code Playgroud)
所以我想在测试中做到这一点:
const barMock = jest.giveMeAMock("../../IBar"); // or …Run Code Online (Sandbox Code Playgroud)