2017-09-07 2 views
0

Ich versuche Unit-Test diese Klasse, die eine Abhängigkeit von AppDB und createStudy hat, die ich verspotten muss. Um loszulegen Ich bin versucht zu Einheit testen Sie die einfache Methode startLoadingData, die ein MobX sein geschieht actionJest-Unit-Klasse mit Abhängigkeiten

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

Meine Testdatei unten wird immer nirgendwo, weil ein Fehler vorliegt geworfen wird im Zusammenhang mit einer separaten Abhängigkeit von sqlite3 in der AppDB und createStudy Importe. Mein Verständnis ist, dass, wenn ich diese zwei Abhängigkeiten spotte, ich den Fehler vermeiden kann, weil sie verspottet werden und nicht reale Implementierungen versuchen, sqlite3 zu verwenden.

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

Wie Sie sehen können, versuchen eine Reihe von Dingen, aber ich scheint nirgends zu bekommen. Ich habe über manuelle Mocks gelesen, und dachte, dass das der Fall sein könnte, so machte ich einen manuellen Schein von Database, aber nicht einmal sicher, ob ich das richtig mache.

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

module.exports = Database 

ich nicht diese Dinge denken, aber es könnte erwähnenswert sein, dass AppDB eine ES6 Klasse und createStudy ist eine Methode.

Antwort

1

Jest sollte auto mock Module von node_modules, wenn Sie einen __mocks__ Ordner in Ihrem Stammordner des Projekts erstellen, und erstellen Sie in diesem Ordner für die Module spottet Sie die automatische verspottet wollen. Mit Auto-Mock meine ich, dass beim Schreiben eines Tests und wenn Jest diesen Ordner entdeckt, dieser automatisch den Mock anstelle des ursprünglichen Moduls lädt. Dies gilt auch für Abhängigkeiten von Abhängigkeiten.

in Ihrem Fall also würde ich versuchen, ein sqlite3 wie so zu erstellen:

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

Mindestens das ist, wie ich mit den Bibliotheken in meinen Jest Tests befassen.

Hoffe, das hilft.

+0

Ich habe diese Dateistruktur mit dem folgenden Code implementiert: 'const sqlite3 = jest.genMockFromModule ('sqlite3'); module.exports = sqlite3; ' Grundsätzlich gibt es keine spezifischen Methoden, die ich verspottet werden muss, ich will nur nicht, dass es in dem tatsächlichen' sqlite3'-Knotenmodul aussieht, weil es aufgrund meiner Projektumgebung (Elektron) nicht mit Jest (Node) kompatibel ist. Es scheint jedoch, sogar mit diesem Mock, das eigentliche 'sqlite3' Modul wird immer noch referenziert. – nschwan94

+0

Es scheint, dass ich mein eigenes Problem gelöst habe, das aufgrund der zwei "package.json" -Struktur meiner Elektronen-App entstanden ist, und dass die 'node_modules' in meinem' app'-Verzeichnis nicht die Bindung für den Knoten hatten, der darin war Mein Wurzelverzeichnis. Eine einfache Kopie der Bindung beseitigte den Fehler, den ich bekam, und beseitigte meine Theorie, dass ich die Bibliothek einfach verspotten sollte. Entschuldigung, dass die Frage tatsächlich spezifischer war, als sie erschien. Aber ich denke, im Prinzip ist Ihre Antwort nach allem, was ich über Jest gelesen habe, sinnvoll. – nschwan94