Jest 单元 Class 具有依赖性
Jest Unit Class with Dependencies
我正在尝试对这个 class 进行单元测试,它具有我需要模拟的 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
}
}
我下面的测试文件无处可去,因为在 AppDB
和 createStudy
导入中抛出与 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 测试中处理库的方式。
希望这对您有所帮助。
我正在尝试对这个 class 进行单元测试,它具有我需要模拟的 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
}
}
我下面的测试文件无处可去,因为在 AppDB
和 createStudy
导入中抛出与 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 测试中处理库的方式。
希望这对您有所帮助。