Mock React Native Dimensions

React Native (RN) is a great tool for developing mobile application and Jest to me is a really straightforward testing tool for it. If you are yet to use Jest to test your RN app, I recommend you to read this article to get a picture of how good it is.

Everything is good with Jest and me, testing my component’s functions, testing actions and reducer, taking snapshots, etc. Until I test a component that use RN’s Dimensions API.

// MyComponent.js
import React, { Component } from "react"
import { Dimensions, Text, View } from "react-native"
const { width, height } = Dimensions.get("screen")
class MyComponent extends Component {
render() {
//use the width and height somewhere here
export default MyComponent
// MyComponent.test.js
import React from "react"
import MyComponent from "./MyComponent"
test("MyComponent default render", () => {
const component = renderer.create(<MyComponent/>)
let tree = component.toJSON()

I run the test and it failed because:

Invariant Violation: No dimension set for key screen

However, if I change the dimensions type from screen to window the test would succeed. So it seems theDimensions API is not mocked entirely in the RN version that I used.

Manual Mock

Here is where manual mock comes into play. The first thing to do is defining the mock itself. I create a folder named __mocks__ which adjacent to my node_modules folder and make a mock file Dimensions.js .

// Dimensions.js inside __mocks__ folder
"use strict";
const Dimensions = {
get: jest.fn().mockReturnValue({width: 100, height:100})
module.exports = Dimensions

And in my test file:

// MyComponent.test.js
import MyComponent from "./MyComponent"

What I do here is telling jest module system to use mockedDimensions that I created instead of the one from the react-native module. By doing this, we can test our component without touching the real implementation of Dimensions API. This method could also be useful if we got another API or Component inside our tested component that need to be mocked.