Jest 单元 Class 具有依赖性

Jest Unit Class with Dependencies

我正在尝试对这个 class 进行单元测试,它具有我需要模拟的 AppDBcreateStudy 的依赖项。首先,我尝试对简单方法 startLoadingData 进行单元测试,它恰好是 MobX action

import { observable, action } from 'mobx'
import { Intent } from '@blueprintjs/core'
import { createStudy } from '../database/DatabaseInit'
import { AppDB } from '../database/Database'


export default class UIStore {
  // ui state
  // booleans indicating open/close state of modals
  @observable createDialogue
  @observable importDialogue
  @observable revisionsDialogue
  @observable runDialogue
  // boolean indicating loading or waiting for async action
  @observable loadingData
  // array indicating navigation
  @observable breadcrumbs
  @observable processingMessages

  constructor(rootStore) {
    this.rootStore = rootStore
    this.breadcrumbs = []
    this.importDialogue = false
    this.createDialogue = false
    this.revisionsDialogue = false
    this.runDialogue = false
    // boolean to display loading blur on table that displays data
    this.loadingData = false
    // processing messages for import and other async loads
    this.processingMessages = []
  }
  @action startLoadingData() {
    this.loadingData = true
  }
}

我下面的测试文件无处可去,因为在 AppDBcreateStudy 导入中抛出与 sqlite3 的单独依赖项相关的错误。我的理解是,如果我模拟这两个依赖项,我可以避免错误,因为它们将被模拟,而不是尝试使用 sqlite3.

的真实实现
// UIStore domain store unit test
// import * as Database from '../../app/database/Database'
// import * as DatabaseInit from '../../app/database/DatabaseInit'
import UIStore from '../../app/stores/UIStore'


describe('UIStore', () => {
  beforeEach(() => {
    // jest.spyOn(Database, 'AppDB').andReturn('mockAppDB')
    // jest.spyOn(DatabaseInit, 'createStudy').andReturn('createStudy')
    jest.mock('../../app/database/Database')
    // jest.mock('DatabaseInit')
  })
  it('starts loading data', () => {
    const testUIStore = new UIStore(this)
    testUIStore.startLoadingData()
    expect(testUIStore.loadingData).toBe(true)
  })
})

如您所见,尝试了很多东西,但我似乎没有任何进展。我读过有关手动模拟的内容,并认为可能是这种情况,所以我对 Database 进行了手动模拟,但甚至不确定我这样做是否正确。

const Database = jest.genMockFromModule('../Database.js')

module.exports = Database

我认为这无关紧要,但可能值得注意的是 AppDB 是 ES6 class 而 createStudy 是一种方法。

Jest 应该 auto mock 来自 node_modules 的模块,如果您在根项目文件夹中创建一个 __mocks__ 文件夹并在该文件夹中为您想要自动模拟的模块创建模拟。通过自动模拟,我的意思是当编写测试并且 Jest 检测到该文件夹​​时,它将自动加载模拟而不是原始模块。这也适用于依赖的依赖。

所以在你的情况下,我会尝试像这样创建一个 sqlite3

/project
|
-> __mocks__
|  |
|  -> sqlite3/index.js <- export mocked functions
|
-> node_modules

至少这是我在 Jest 测试中处理库的方式。

希望这对您有所帮助。