2017-09-07 36 views
0

我試圖單元測試這一類,它具有的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 
    } 
} 

我的測試文件下面是毫無進展,因爲有被拋出相關的sqlite3在一個單獨依賴一個錯誤AppDBcreateStudy進口。我的理解是,如果我嘲笑這兩個依賴,我可避免的錯誤,因爲他們會被嘲笑,而不是真正的實現欲以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是一種方法。

回答

1

如果您在根項目文件夾中創建__mocks__文件夾,並在該文件夾中創建要模擬自動模塊的模塊,則應從node_modules獲得auto mock模塊。通過自動模擬,我的意思是,在編寫測試時,Jest檢測到該文件夾​​會自動加載模擬代替原始模塊。這也適用於依賴關係的依賴關係。

所以你的情況我會嘗試創建一個sqlite3像這樣:

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

至少這是我如何處理我的玩笑測試庫。

希望這會有所幫助。

+0

我已經使用下面的代碼實現了該文件結構: 'const sqlite3 = jest.genMockFromModule('sqlite3'); module.exports = sqlite3; ' 基本上沒有我不必嘲笑具體方法,我只是不希望它的實際'sqlite3'節點模塊中尋找,因爲由於我的項目環境(電子),它是用玩笑(節點)不兼容。 然而,似乎即使有這樣的模擬,實際'sqlite3'模塊仍然被引用。 – nschwan94

+0

看來我已經解決我自己的問題,是由於起源於我的電子應用的兩個'package.json'結構,那'node_modules'在我的'app'目錄並沒有因爲這是在節點的綁定我的根目錄。一個簡單的綁定副本消除了我得到的錯誤,並消除了我應該簡單地嘲笑庫的理論。對不起,這個問題實際上比看起來更具體。但是,我認爲原則上,根據我讀過的關於Jest的其他所有內容,你的答案是有意義的。 – nschwan94