| FBSnapshotTestCase | 
 | ====================== | 
 |  | 
 | [](https://travis-ci.org/facebook/ios-snapshot-test-case) [](http://cocoadocs.org/docsets/FBSnapshotTestCase/) | 
 |  | 
 | What it does | 
 | ------------ | 
 |  | 
 | A "snapshot test case" takes a configured `UIView` or `CALayer` and uses the | 
 | `renderInContext:` method to get an image snapshot of its contents. It | 
 | compares this snapshot to a "reference image" stored in your source code | 
 | repository and fails the test if the two images don't match. | 
 |  | 
 | Why? | 
 | ---- | 
 |  | 
 | At Facebook we write a lot of UI code. As you might imagine, each type of | 
 | feed story is rendered using a subclass of `UIView`. There are a lot of edge | 
 | cases that we want to handle correctly: | 
 |  | 
 | - What if there is more text than can fit in the space available? | 
 | - What if an image doesn't match the size of an image view? | 
 | - What should the highlighted state look like? | 
 |  | 
 | It's straightforward to test logic code, but less obvious how you should test | 
 | views. You can do a lot of rectangle asserts, but these are hard to understand | 
 | or visualize. Looking at an image diff shows you exactly what changed and how | 
 | it will look to users. | 
 |  | 
 | We developed `FBSnapshotTestCase` to make snapshot tests easy. | 
 |  | 
 | Installation with CocoaPods | 
 | --------------------------- | 
 |  | 
 | 1. Add the following lines to your Podfile: | 
 |  | 
 |      ``` | 
 |      target "Tests" do | 
 |        pod 'FBSnapshotTestCase' | 
 |      end | 
 |      ``` | 
 |  | 
 |    If you support iOS 7 use `FBSnapshotTestCase/Core` instead, which doesn't contain Swift support. | 
 |  | 
 |    Replace "Tests" with the name of your test project. | 
 |  | 
 | 2. There are [three ways](https://github.com/facebook/ios-snapshot-test-case/blob/master/FBSnapshotTestCase/FBSnapshotTestCase.h#L19-L29) of setting reference image directories, the recommended one is to define `FB_REFERENCE_IMAGE_DIR` in your scheme. This should point to the directory where you want reference images to be stored. At Facebook, we normally use this: | 
 |  | 
 | |Name|Value| | 
 | |:---|:----| | 
 | |`FB_REFERENCE_IMAGE_DIR`|`$(SOURCE_ROOT)/$(PROJECT_NAME)Tests/ReferenceImages`| | 
 |  | 
 |  | 
 |  | 
 |  | 
 | Creating a snapshot test | 
 | ------------------------ | 
 |  | 
 | 1. Subclass `FBSnapshotTestCase` instead of `XCTestCase`. | 
 | 2. From within your test, use `FBSnapshotVerifyView`. | 
 | 3. Run the test once with `self.recordMode = YES;` in the test's `-setUp` | 
 |    method. (This creates the reference images on disk.) | 
 | 4. Remove the line enabling record mode and run the test. | 
 |  | 
 | Features | 
 | -------- | 
 |  | 
 | - Automatically names reference images on disk according to test class and | 
 |   selector. | 
 | - Prints a descriptive error message to the console on failure. (Bonus: | 
 |   failure message includes a one-line command to see an image diff if | 
 |   you have [Kaleidoscope](http://www.kaleidoscopeapp.com) installed.) | 
 | - Supply an optional "identifier" if you want to perform multiple snapshots | 
 |   in a single test method. | 
 | - Support for `CALayer` via `FBSnapshotVerifyLayer`. | 
 | - `usesDrawViewHierarchyInRect` to handle cases like `UIVisualEffect`, `UIAppearance` and Size Classes. | 
 | - `isDeviceAgnostic` to allow appending the device model (`iPhone`, `iPad`, `iPod Touch`, etc), OS version and screen size to the images (allowing to have multiple tests for the same «snapshot» for different `OS`s and devices). | 
 |  | 
 | Notes | 
 | ----- | 
 |  | 
 | Your unit test must be an "application test", not a "logic test." (That is, it | 
 | must be run within the Simulator so that it has access to UIKit.) In Xcode 5 | 
 | and later new projects only offer application tests, but older projects will | 
 | have separate targets for the two types. | 
 |  | 
 | Authors | 
 | ------- | 
 |  | 
 | `FBSnapshotTestCase` was written at Facebook by | 
 | [Jonathan Dann](https://facebook.com/j.p.dann) with significant contributions by | 
 | [Todd Krabach](https://facebook.com/toddkrabach). | 
 |  | 
 | License | 
 | ------- | 
 |  | 
 | `FBSnapshotTestCase` is BSD-licensed. See `LICENSE`. |