相关疑难解决方法(0)

如何使用Jest模拟es6类

我试图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)

javascript unit-testing jestjs

18
推荐指数
2
解决办法
2万
查看次数

jest.mock():如何使用factory参数模拟ES6类的默认导入

嘲弄ES6类进口

我想在我的测试文件中模拟我的ES6类导入.

如果被模拟的类有多个使用者,那么将模拟移动到__mocks__可能是有意义的,这样所有测试都可以共享模拟,但在此之前我想将模拟保留在测试文件中.

Jest.mock()

jest.mock()可以模拟导入的模块.传递单个参数时:

jest.mock('./my-class.js');
Run Code Online (Sandbox Code Playgroud)

它使用与模拟文件相邻的__mocks__文件夹中的模拟实现,或创建自动模拟.

模块工厂参数

jest.mock()采用第二个参数,它是模块工厂函数.对于使用导出的ES6类export default,不清楚此工厂函数应该返回什么.是吗:

  1. 另一个函数返回一个模仿该类实例的对象?
  2. 一个模仿类实例的对象?
  3. 具有属性的对象,该属性default是返回模仿类实例的对象的函数?
  4. 一个返回高阶函数的函数,该函数本身返回1,2或3?

文档很模糊:

第二个参数可用于指定正在运行的显式模块工厂,而不是使用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)

javascript ecmascript-6 jestjs

17
推荐指数
2
解决办法
2万
查看次数

对具有 DI 依赖项的类开玩笑

各种 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)

typescript jestjs

7
推荐指数
1
解决办法
6350
查看次数