2017-11-18 7 views
2

モジュール内でメソッド/関数が起動されたかどうかを確認する方法がわかりません。 これは私の例である:NodeJsモジュール/アプリケーションをテストするためにJestでスパイを使用する方法

db.js

module.exports.saveUser = (user) => { 
    console.log('Saving the user', user); 
}; 

app.js

let db = require('./db'); 

module.exports.handleSignup = (email, password) => { 
    db.saveUser({ email, password }); 
} 

app.test.js

const db = require('./db'); 
jest.genMockFromModule('./app'); 
const app = require('./app'); 

describe('App: ',() => { 
    it('should call "db.saveUser" with a user object',() => { 
     let dbSpy = jest.spyOn(db, 'saveUser'); 
     const user = { email: '[email protected]', password: 'abc123' }; 
     app.handleSignup(user.email, user.password); 
     expect(dbSpy).toBeCalled(); 
    }); 
}); 

このテストを実行すると、saveUser()で書かれたconsole.logがシェルから見えるので、db.saveUser()が起動していて、JestがsaveUser()をモックアップしていないことを意味します。 私は何が間違っていますか?ここで与えられた手動のモックの例を参照

答えて

0

https://facebook.github.io/jest/docs/en/manual-mocks.html

jest.genMockFromModule()は、実際にはモックモジュールファイルに呼ばれています。それでも、あなたが嘲笑しているdbファイルがあなた自身のローカルファイルの1つであるなら、genMockFromModuleを呼び出す必要はありません。私は、あなたのnode_modulesフォルダとコアモジュールでNPMモジュールのために使われていると信じている(例えば、「FS」など「readlineの」、)

それはさておき

私はスポックに取り組んできましたしばらく私は嘲笑し、試行錯誤のプロセスであることがわかりました。時には、あなたが期待しているように、それほど性能があまりないので、少し創造的にする必要があります。

複数のインスタンス(と、私は想像する、あなたのケースで動作します)に私のために働いた簡単なアプローチ:

モック作成: ./__mocks__/db.js(私は仮定していdb.jsをプロジェクトの中でさベースディレクトリのフォルダ)./__tests__/app.test.jsで、その後

module.exports = { 
    fileSaveObserver: [], 
    getFileSaveObserver() { 
    return this.fileSaveObserver; 
    }, 
    saveUser (obj) { 
    this.fileSaveObserver.push(obj); 
    } 
} 

jest.mock('./db.js'); 
const app = require('../app'); 

describe('App: ',() => { 
    test('should call "db.saveUser" with a user object',() => { 
    const user = { email: '[email protected]', password: 'abc123' }; 
    app.handleSignup(user.email, user.password); 
    const db = require('./db.js'); 
    const observer = db.getFileSaveObserver() 
    expect(observer.length).toBe(1) 
    expect(observer).toEqual(user); 
    }) 

あなたは上記の問題を抱えている場合は、削除してみてくださいjest.mock()ステートメントとrequireステートメントからの '.js'ファイル拡張子(これはいくつかの機会に私にとってはうっかりです。

希望に応えたい!

関連する問題