Asset basenames in Jest snapshots

Summary:
This change only affects tests run with Jest. `require('/images/image1.png')` will be replaced with

```
Object {
  "testUri": "relative/path/to/images/image1.png",
}
```

in the Jest snapshot instead of always being 1 returned by RelativeImageStub. This change makes it possible to test conditional asset loading in components.

The problem with this change is that it will probably break a lot of existing snapshots, but that should be easily fixed when a project updates to a new version of React Native by running `jest -u` to update all snapshots.

A component can have conditional asset loading based on its props, this logic would be nice to test with Jest snapshots. This problem has been discussed in https://github.com/facebook/jest/issues/2838.

* **Who does this affect**: Everyone using `Image` in Jest snapshots
* **How to migrate**: Running `jest -u` will update the snapshots, the snapshots should be reviewed that they are correct.
* **Why make this breaking change**: It enables testing of conditional asset loading.
* **Severity (number of people affected x effort)**: Low.
Closes https://github.com/facebook/react-native/pull/13319

Reviewed By: rafeca

Differential Revision: D5708180

Pulled By: mjesun

fbshipit-source-id: 16ac42004d597db08545a21d4fffe95c5ee7e21f
This commit is contained in:
Martin Yrjölä 2017-09-06 03:18:37 -07:00 committed by Facebook Github Bot
parent ad733ad430
commit 25639176ff
7 changed files with 77 additions and 3 deletions

View File

@ -0,0 +1,20 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`renders assets based on relative path 1`] = `
<View>
<Image
source={
Object {
"testUri": "Libraries/Image/__tests__/img/img1.png",
}
}
/>
<Image
source={
Object {
"testUri": "Libraries/Image/__tests__/img/img2.png",
}
}
/>
</View>
`;

View File

@ -0,0 +1,25 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
'use strict';
jest.disableAutomock();
const React = require('React');
const ReactTestRenderer = require('react-test-renderer');
const Image = require('Image');
const View = require('View');
it('renders assets based on relative path', () => {
expect(ReactTestRenderer.create(
<View>
<Image source={require('./img/img1.png')} />
<Image source={require('./img/img2.png')} />
</View>
)).toMatchSnapshot();
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 B

View File

@ -7,12 +7,15 @@
] ]
}, },
"moduleNameMapper": { "moduleNameMapper": {
"^[./a-zA-Z0-9$_-]+\\.(bmp|gif|jpg|jpeg|png|psd|svg|webp)$": "RelativeImageStub",
"^React$": "<rootDir>/node_modules/react" "^React$": "<rootDir>/node_modules/react"
}, },
"modulePathIgnorePatterns": [ "modulePathIgnorePatterns": [
"<rootDir>/node_modules/react-native/Libraries/react-native/" "<rootDir>/node_modules/react-native/Libraries/react-native/"
], ],
"transform": {
"^.+\\.js$": "babel-jest",
"^[./a-zA-Z0-9$_-]+\\.(bmp|gif|jpg|jpeg|png|psd|svg|webp)$": "<rootDir>/node_modules/react-native/jest/assetFileTransformer.js"
},
"transformIgnorePatterns": [ "transformIgnorePatterns": [
"node_modules/(?!(jest-)?react-native|react-clone-referenced-element)" "node_modules/(?!(jest-)?react-native|react-clone-referenced-element)"
], ],

View File

@ -0,0 +1,26 @@
/**
* Copyright (c) 2017-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
'use strict';
/* eslint-env node */
const path = require('path');
const createCacheKeyFunction = require('fbjs-scripts/jest/createCacheKeyFunction');
module.exports = {
// Mocks asset requires to return the filename. Makes it possible to test that
// the correct images are loaded for components. Essentially
// require('img1.png') becomes `Object { "testUri": 'path/to/img1.png' }` in
// the Jest snapshot.
process: (_, filename) =>
`module.exports = {
testUri: ${JSON.stringify(path.relative('.', filename))}
};`,
getCacheKey: createCacheKeyFunction([__filename]),
};

View File

@ -12,6 +12,7 @@
}, },
"jest": { "jest": {
"transform": { "transform": {
"^[./a-zA-Z0-9$_-]+\\.(bmp|gif|jpg|jpeg|png|psd|svg|webp)$": "<rootDir>/jest/assetFileTransformer.js",
".*": "./jest/preprocessor.js" ".*": "./jest/preprocessor.js"
}, },
"setupFiles": [ "setupFiles": [
@ -19,8 +20,7 @@
], ],
"timers": "fake", "timers": "fake",
"moduleNameMapper": { "moduleNameMapper": {
"^React$": "<rootDir>/Libraries/react-native/React.js", "^React$": "<rootDir>/Libraries/react-native/React.js"
"^[./a-zA-Z0-9$_-]+\\.png$": "RelativeImageStub"
}, },
"testPathIgnorePatterns": [ "testPathIgnorePatterns": [
"Libraries/Renderer", "Libraries/Renderer",