2017-09-07 18 views
0

내가 모의 할 필요가있는 AppDBcreateStudy의 종속성을 가진이 클래스를 단위 테스트하려고합니다. 나는 MobX 될 일이 간단한 방법 startLoadingData를 단위 테스트를 시도하고있어 시작하려면 action종속성을 지닌 Jest Unit 클래스

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

당신이 볼 수 있듯이, 많은 것들을 시도하지만 나는 어디에도 가지 않는 것처럼 보입니다. 나는 수동 mock에 대해 읽었고, 그럴 수도 있다고 생각했기 때문에 나는 Database의 수동 모의를 만들었지 만, 내가 올바르게하고 있는지 확실하지는 않습니다.

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

module.exports = Database 

나는이 문제를 생각 해달라고하지만 AppDB는 ES6 클래스이고 createStudy는 방법이다 협조 할 수 있습니다.

답변

1

루트 프로젝트 폴더에 __mocks__ 폴더를 만들고 자동 조롱하려는 모듈에 해당 폴더를 만들면 node_modules에서 모듈이 auto mock이어야합니다. 오토 모의 (auto mock)이란 테스트를 작성할 때 Jest가 해당 폴더를 감지하면 자동으로 원래 모듈 대신 모의 객체를로드한다는 것을 의미합니다. 이는 종속성의 종속성에도 적용됩니다.

따라서 귀하의 경우에는 내가 sqlite3과 같이 만들려고 할 것이다 : 내 농담 테스트에서 라이브러리를 다루는 방법

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

은 적어도이있다.

희망이 도움이됩니다.

+0

다음 코드로 파일 구조를 구현했습니다. 'const sqlite3 = jest.genMockFromModule ('sqlite3'); module.exports = sqlite3; ' 기본적으로 조롱을 받아야하는 구체적인 방법은 없습니다. 실제 프로젝트 환경 (Electron) 때문에 Jest (Node)와 호환되지 않기 때문에 실제로'sqlite3' 노드 모듈을보고 싶지는 않습니다. 그러나이 모의 문장을 사용해도 실제'sqlite3' 모듈은 여전히 ​​참조되고 있습니다. – nschwan94

+0

내 전자 응용 프로그램의 두 가지'package.json' 구조로 인해 발생한 문제를 해결했으며 내 app 디렉토리의 node_modules에있는 노드에 대한 바인딩이 없다는 것을 알았습니다 내 루트 디렉토리. 바인딩의 단순한 복사본은 내가 얻은 오류를 제거하고, 단순히 라이브러리를 조롱해야한다는 나의 이론을 제거했다. 죄송 합니다만 그 질문은 실제로 나타난 것보다 구체적이었습니다. 그러나 나는 원칙적으로 Jest에 관해 읽은 다른 모든 것에 따르면 당신의 대답이 합리적이라고 생각합니다. – nschwan94