2017-06-18 7 views
3

Bin ziemlich neu in JS, aber ich versuche mein Bestes zu lernen. So wie es ist, versuche ich mich auszudrücken. Hier ist meine Basisklasse (abgeholzt, für Testzwecke):Mocking Express mit Scherz?

import compression from 'compression'; 
import express from 'express'; 

export default class Index{ 
    constructor(){} 

    spawnServer(){ 
     console.log(express()); 
     let app = express();  

     app.use(STATIC_PATH, express.static('dist')); 
     app.use(STATIC_PATH, express.static('public')); 
     etc... 
    } 
} 

Und hier ist der Test, den ich zu erreichen bin versucht, in einer separaten Testdatei ...:

test('should invoke express once',() =>{  
    index.spawnServer();  
    expect(mockExpressFuncs().use.mock.calls.length).toBe(3); 
}) 

Meine Frage ist - wie mache ich den Test überschreiben die Anforderung der Klasse im Test - ist das überhaupt möglich? Ich möchte, dass mein Index eine verspottete Version von express verwendet, die express() und express.require enthält.

ich durch die Dokumentation habe gelesen, und versucht so etwas wie:

const mockFunction = function() { 
     return { 
      use: useFn, 
      listen: jest.fn() 
     }; 
    }; 

beforeEach(() => {      
    jest.mock('express',() => {  
     return mockFunction; 
    }) 
    express = require('express'); 
}); 

aber das hat nicht funktioniert - was ich falsch mache? :(

Dank.

Antwort

1

Erstellen Sie das Mock App Objekt und machen es per Express-Modul zurückgegeben werden.

Dann können Sie überprüfen, wie oft app.use wurden gerufen, entweder expect(app.use.mock.calls.length).toBe(3) oder besser expect(app.use).toHaveBeenCalledTimes(1)

const app = { 
    use: jest.fn(), 
    listen: jest.fn() 
} 
jest.doMock('express',() => { 
    return() => { 
    return app 
    } 
}) 

test('should invoke express once',() => { 
    expect(app.use).toHaveBeenCalledTimes(1) 
})