0

我正在尝试对这个具有依赖关系AppDB并且createStudy我需要模拟的类进行单元测试。首先,我正在尝试对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
  }
}

我下面的测试文件无处可去,因为引发了与sqlite3inAppDBcreateStudy导入中的单独依赖项相关的错误。我的理解是,如果我模拟这两个依赖项,我可以避免错误,因为它们将被模拟,而不是尝试使用的真实实现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 类并且createStudy是一种方法。

4

1 回答 1

1

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

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

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

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

希望这可以帮助。

于 2017-09-07T19:32:16.093 回答