2017-09-07 21 views
0

私はモックする必要があるAppDBcreateStudyの依存関係を持つこのクラスを単体テストしようとしています。私はユニットテストにsqlite3の別々の依存に関連スローされ、エラーがありますので、下記の私のテストファイルはどこにもなっていないMobX action依存関係を持つJestユニットクラス

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 
    } 
} 

であることを起こる簡単な方法startLoadingDataをしようとしています開始するにはAppDBおよびcreateStudyのインポートです。私が理解しているのは、これらの2つの依存関係を模倣すると、エラーを避けることができるということです。なぜなら、彼らは嘲笑され、実際の実装では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

JSTはフォルダをルートプロジェクトフォルダに作成し、そのフォルダに自動モックさせたいモジュールを作成すると、node_modulesからモジュールを作成する必要があります。オートモックでは、テストを書くときにJestがそのフォルダを検出すると、元のモジュールの代わりにモックが自動的にロードされることを意味します。これは依存関係の依存関係にも適用されます。

だからあなたの場合には、私はそうのようなsqlite3を作成しようとする:

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

は、少なくともこれは私が私の冗談のテストでライブラリを扱う方法です。

これが役に立ちます。

+0

私は、次のコードでそのファイル構造を実装しました: 'const sqlite3 = jest.genMockFromModule( 'sqlite3'); module.exports = sqlite3; ' 基本的に私は嘲笑する必要のある具体的な方法はありません。実際のプロジェクト環境(Electron)のために実際の' sqlite3'ノードモジュールを見たくないのはJest(Node)と互換性がないからです。 しかし、このモックでも実際の 'sqlite3'モジュールはまだ参照されています。 – nschwan94

+0

私は私の電子アプリケーションの2つの 'package.json'構造に起因する私自身の問題を解決したようで、' app'ディレクトリの 'node_modules'はそこにあったノードのバインディングを持っていません私のルートディレクトリ。バインディングの単純なコピーは、私が得ていたエラーを取り除き、ライブラリを単に模倣すべきであるという私の理論を排除しました。申し訳ありませんが、その質問は現実よりも具体的でした。しかし、私は原則として、あなたの答えは、私がJestについて読んだ他のすべてに応じて意味をなさないと思います。 – nschwan94

関連する問題