2017-12-31 164 views
0

Verwendung habe ich eine Datei mit dem Objekt, das mit process.env Eigenschaften bevölkert wird:Invalidate Knoten Cache, wenn Jest

env.js

console.log('LOADING env.js'); 

const { 
    PROXY_PREFIX = '/api/', 
    USE_PROXY = 'true', 
    APP_PORT = '8080', 
    API_URL = 'https://api.address.com/', 
    NODE_ENV = 'production', 
} = process.env; 

const ENV = { 
    PROXY_PREFIX, 
    USE_PROXY, 
    APP_PORT, 
    API_URL, 
    NODE_ENV, 
}; 

module.exports.ENV = ENV; 

Jetzt habe ich versuchen, diese Datei zu testen, mit verschiedenen process.env Eigenschaften:

env.test.js

const envFilePath = '../../config/env'; 

describe('environmental variables',() => { 
    const OLD_ENV = process.env; 

    beforeEach(() => { 
    process.env = { ...OLD_ENV }; 
    delete process.env.NODE_ENV; 
    }); 

    afterEach(() => { 
    process.env = OLD_ENV; 
    }); 

    test('have default values',() => { 
    const { ENV } = require(envFilePath); 
    expect(ENV).toMatchSnapshot(); 
    }); 

    test('are string values (to avoid casting errors)',() => { 
    const { ENV } = require(envFilePath); 
    Object.values(ENV).forEach(val => expect(typeof val).toEqual('string')); 
    }); 

    test('will receive process.env variables',() => { 
    process.env.NODE_ENV = 'dev'; 
    process.env.PROXY_PREFIX = '/new-prefix/'; 
    process.env.API_URL = 'https://new-api.com/'; 
    process.env.APP_PORT = '7080'; 
    process.env.USE_PROXY = 'false'; 

    const { ENV } = require(envFilePath); 

    expect(ENV.NODE_ENV).toEqual('dev'); 
    expect(ENV.PROXY_PREFIX).toEqual('/new-prefix/'); 
    expect(ENV.API_URL).toEqual('https://new-api.com/'); 
    expect(ENV.APP_PORT).toEqual('7080'); 
    expect(ENV.USE_PROXY).toEqual('false'); 
    }); 
}); 

Leider, obwohl ich versuchen, die Datei in jedem Test zu laden separat die Datei nur einmal geladen wird, der dritte Test machen nicht mit:

Expected value to equal: 
    "dev" 
Received: 
    "production" 

P. S. Es scheitert nicht, wenn ich den Test alleine führe.

Ich weiß auch, dass env.js lädt nur einmal, weil console.log('LOADING env.js'); nur einmal ausgelöst wird.

Ich habe versucht, Knoten Cache ungültig zu machen, wie:

beforeEach(() => { 
    delete require.cache[require.resolve(envFilePath)]; 
    process.env = { ...OLD_ENV }; 
    delete process.env.NODE_ENV; 
    }); 

aber require.cache{} vor jedem Test leer ist, so scheint es, dass Jest für den Import der Datei irgendwie verantwortlich ist.

Ich habe auch versucht, yarn jest --no-cache laufen, hat aber nicht geholfen.

Also was ich will ist, laden env.js vor jedem Test, damit ich testen kann, wie es mit verschiedenen Knoten Umgebungsvariablen verhält.

[email protected]^22.0.4

+0

Welche Version von 'jest' zurückgesetzt verwenden Sie? –

+0

@Prakashsharma 22.0.4 – Tomasz

+0

Versuchen Sie 'jest.resetModules()' in 'beforeEach' zu verwenden. https://facebook.github.io/jest/docs/en/jest-object.html#jestresetmodules –

Antwort

2

Sie jest.resetModules() in beforeEach Methode können die bereits benötigten Module

beforeEach(() => { 
    jest.resetModules() 
    process.env = { ...OLD_ENV }; 
    delete process.env.NODE_ENV; 
});