diff --git a/packages/react-scripts/config/polyfills.js b/packages/react-scripts/config/polyfills.js
index 673fb8399b43756e078f1f535fa32f0918f862bb..8d97fb4ac39bbe29f7b7d4a756f523491dd159a1 100644
--- a/packages/react-scripts/config/polyfills.js
+++ b/packages/react-scripts/config/polyfills.js
@@ -22,3 +22,9 @@ require('whatwg-fetch');
 // Object.assign() is commonly used with React.
 // It will use the native implementation if it's present and isn't buggy.
 Object.assign = require('object-assign');
+
+// In tests, polyfill requestAnimationFrame since jsdom doesn't provide it yet.
+// We don't polyfill it in the browser--this is user's responsibility.
+if (process.env.NODE_ENV === 'test') {
+  require('raf').polyfill(global);
+}
diff --git a/packages/react-scripts/package.json b/packages/react-scripts/package.json
index 2b793a35daba3df5fff3b8c7abc5d5af4defcbd3..1eedb9e99aa2fee11364e732193fd972756702a6 100644
--- a/packages/react-scripts/package.json
+++ b/packages/react-scripts/package.json
@@ -48,6 +48,7 @@
     "postcss-flexbugs-fixes": "3.2.0",
     "postcss-loader": "2.0.6",
     "promise": "8.0.1",
+    "raf": "3.4.0",
     "react-dev-utils": "^4.1.0",
     "style-loader": "0.19.0",
     "sw-precache-webpack-plugin": "0.11.4",