mirror of https://github.com/facebook/jest.git
Resolve dynamic dependencies correctly when a mapping exists (#9303)
This commit is contained in:
parent
a2fcda653d
commit
9419034d6b
|
@ -63,6 +63,7 @@
|
|||
- `[jest-reporters]` Make node-notifier an optional dependency ([#8918](https://github.com/facebook/jest/pull/8918))
|
||||
- `[jest-reporters]` Make all arguments to methods on `BaseReporter` optional ([#9159](https://github.com/facebook/jest/pull/9159))
|
||||
- `[jest-resolve]`: Set MODULE_NOT_FOUND as error code when module is not resolved from paths ([#8487](https://github.com/facebook/jest/pull/8487))
|
||||
- `[jest-resolve-dependencies]` Handle dynamic dependencies correctly even when using module maps ([#9303](https://github.com/facebook/jest/pull/9303))
|
||||
- `[jest-snapshot]` Remove only the added newlines in multiline snapshots ([#8859](https://github.com/facebook/jest/pull/8859))
|
||||
- `[jest-snapshot]` Distinguish empty string from external snapshot not written ([#8880](https://github.com/facebook/jest/pull/8880))
|
||||
- `[jest-snapshot]` [**BREAKING**] Distinguish empty string from internal snapshot not written ([#8898](https://github.com/facebook/jest/pull/8898))
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
import * as path from 'path';
|
||||
import {json as runWithJson} from '../runJest';
|
||||
|
||||
const dir = path.resolve(__dirname, '../dynamic-require-dependencies');
|
||||
|
||||
test('successfully runs tests with dynamic dependencies', () => {
|
||||
const {json} = runWithJson(dir, ['--findRelatedTests', 'dynamicRequire.js']);
|
||||
expect(json.success).toBe(true);
|
||||
expect(json.numTotalTests).toBe(2);
|
||||
});
|
|
@ -0,0 +1,16 @@
|
|||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
test('loading a file with a dynamic local require should work', () => {
|
||||
const {withStandardResolution} = require('../dynamicRequire');
|
||||
expect(withStandardResolution()).toBe(1);
|
||||
});
|
||||
|
||||
test('loading a file with a dynamic require and custom resolve should work', () => {
|
||||
const {withCustomResolution} = require('../dynamicRequire');
|
||||
expect(withCustomResolution()).toBe(1);
|
||||
});
|
|
@ -0,0 +1,13 @@
|
|||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
const dynamicModuleName = 'source';
|
||||
|
||||
module.exports.withStandardResolution = () =>
|
||||
require(`./${dynamicModuleName}.js`);
|
||||
module.exports.withCustomResolution = () =>
|
||||
require(`$asdf/${dynamicModuleName}.js`);
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"jest": {
|
||||
"moduleNameMapper": {
|
||||
"^\\$asdf/(.*)$": "<rootDir>/$1"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
module.exports = 1;
|
|
@ -5,6 +5,7 @@
|
|||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
import Resolver = require('jest-resolve');
|
||||
import {tmpdir} from 'os';
|
||||
import * as path from 'path';
|
||||
import {Config} from '@jest/types';
|
||||
|
@ -15,6 +16,7 @@ import DependencyResolver from '../index';
|
|||
|
||||
const maxWorkers = 1;
|
||||
let dependencyResolver: DependencyResolver;
|
||||
let runtimeContextResolver: Resolver;
|
||||
let Runtime;
|
||||
let config: Config.ProjectConfig;
|
||||
const cases: Record<string, jest.Mock> = {
|
||||
|
@ -29,11 +31,13 @@ beforeEach(() => {
|
|||
config = makeProjectConfig({
|
||||
cacheDirectory: path.resolve(tmpdir(), 'jest-resolve-dependencies-test'),
|
||||
moduleDirectories: ['node_modules'],
|
||||
moduleNameMapper: [['^\\$asdf/(.*)$', '<rootDir>/$1']],
|
||||
rootDir: '.',
|
||||
roots: ['./packages/jest-resolve-dependencies'],
|
||||
});
|
||||
return Runtime.createContext(config, {maxWorkers, watchman: false}).then(
|
||||
(runtimeContext: any) => {
|
||||
runtimeContextResolver = runtimeContext.resolver;
|
||||
dependencyResolver = new DependencyResolver(
|
||||
runtimeContext.resolver,
|
||||
runtimeContext.hasteFS,
|
||||
|
@ -106,3 +110,18 @@ test('resolves inverse dependencies from available snapshot', () => {
|
|||
]),
|
||||
);
|
||||
});
|
||||
|
||||
test('resolves dependencies correctly when dependency resolution fails', () => {
|
||||
jest.spyOn(runtimeContextResolver, 'resolveModule').mockImplementation(() => {
|
||||
throw new Error('resolveModule has failed');
|
||||
});
|
||||
jest.spyOn(runtimeContextResolver, 'getMockModule').mockImplementation(() => {
|
||||
throw new Error('getMockModule has failed');
|
||||
});
|
||||
|
||||
const resolved = dependencyResolver.resolve(
|
||||
path.resolve(__dirname, '__fixtures__', 'file.test.js'),
|
||||
);
|
||||
|
||||
expect(resolved).toEqual([]);
|
||||
});
|
||||
|
|
|
@ -58,8 +58,12 @@ class DependencyResolver {
|
|||
dependency,
|
||||
options,
|
||||
);
|
||||
} catch (e) {
|
||||
resolvedDependency = this._resolver.getMockModule(file, dependency);
|
||||
} catch {
|
||||
try {
|
||||
resolvedDependency = this._resolver.getMockModule(file, dependency);
|
||||
} catch {
|
||||
// leave resolvedDependency as undefined if nothing can be found
|
||||
}
|
||||
}
|
||||
|
||||
if (resolvedDependency) {
|
||||
|
|
Loading…
Reference in New Issue