2017-03-10 5 views
3

sum.jsMocking erfordern Aussagen mit Jest

module.exports = function sum(a, b){ 
    return a + b; 
}; 

Thing.js

var sum = require("./sum"); 

module.exports = class Thing { 
    add(a, b){ 
     return sum(a, b); 
    } 
} 

Thing.test.js

test('1 + 2 = 3',() => { 
    //Arrange 
    var Thing = require('./Thing'); 
    var thing = new Thing(); 

    //Act 
    var result = thing.add(1, 2); 

    //Assert 
    expect(result).toBe(3); 
}); 

test('sum mocked',() => { 
    //Arrange 
    jest.mock('./sum',() => { 
     return jest.fn(() => 42); 
    }); 

    var Thing = require('./Thing'); 
    var thing = new Thing(); 

    //Act 
    var result = thing.add(1, 2); 

    //Assert 
    expect(result).toBe(42); 
}); 

Wie kann ich die Summe spotten 'require' Abhängigkeit beim Testen? Ich erhalte den folgenden Fehler.

sum mocked 

    expect(received).toBe(expected) 

    Expected value to be (using ===): 
     42 
    Received: 
     3 

Was interessant, wenn ich jeden Test einzeln mit .only laufen, sie arbeiten beide ganz gut auf eigene Faust.

In der Vergangenheit habe ich Proxyquire verwendet, um solche Dinge zu tun, aber ich würde es gerne vermeiden, wenn möglich.

Antwort

1

Im Test habe ich

beforeEach(() => { 
    jest.resetModules(); 
}); 

und die Tests wie erwartet bestanden.

2

Ich habe das Gefühl, dass Mocking pro Testdatei funktioniert. Frag mich nicht, warum ¯ \ _ (ツ) _/¯

Der Ansatz, der das Beste für mich gearbeitet wurde, die Tests wie folgt festgelegt:

// sum.test.js 
//Arrange 
const sum = require('./sum'); 

test('1 + 2 = 3',() => { 
    //Act 
    const result = sum(1, 2); 

    //Assert 
    expect(result).toBe(3); 
}); 

Und:

// Thing.test.js 
//Arrange 
const Thing = require('./Thing'); 

// jest.mock are hoisted so you can keep imports/require on top 
const sumSpy = jest.fn(() => 42); 
jest.mock('./sum',() => sumSpy); 

test('Thing',() => { 
    const thing = new Thing(); 

    //Act 
    const result = thing.add(1, 2); 

    //Assert 
    expect(sumSpy).toHaveBeenCalledTimes(1); 
    expect(result).toBe(42); 
}); 

Sie können sogar verschiedene Mock-Implementierungen pro Test mit so etwas wie bieten:

sumSpy.mockImplementation(() => NaN); 
0

vom Jest Docs Genommen.

beforeEach(() => { 
    jest.resetModules(); 
}); 

test('moduleName 1',() => { 
    jest.doMock('../moduleName',() => { 
    return jest.fn(() => 1); 
    }); 
    const moduleName = require('../moduleName'); 
    expect(moduleName()).toEqual(1); 
}); 

test('moduleName 2',() => { 
    jest.doMock('../moduleName',() => { 
    return jest.fn(() => 2); 
    }); 
    const moduleName = require('../moduleName'); 
    expect(moduleName()).toEqual(2); 
}); 

https://facebook.github.io/jest/docs/en/jest-object.html#jestdomockmodulename-factory-options