Interactive Fixture Approvals for RSpec
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
bin
demo
example
lib
spec
.gitignore
.rspec
.travis.yml
Gemfile
LICENSE
README.md
Runfile
demo.gif
rspec_fixtures.gemspec

README.md

RSpec Fixtures

Gem Version Build Status Maintainability Test Coverage


RSpec Fixtures allows you to interactively review and approve testable content.

This is a "What You See is What You Test" for your specs, because a Fixture is worth a thousand Mocks... (too much?...)

demo


Install

$ gem install rspec_fixtures

Or with bundler:

gem 'rspec_fixtures'

Usage

Require the gem in your spec helper:

# spec/spec_helper.rb
require 'rspec_fixtures'

And use any of the matchers in your specs.

describe 'ls' do
  it "works" do
    expect(`ls`).to match_fixture('ls_fixture')
  end
end

Matchers

match_fixture - Compare Strings

Compare a string with a pre-approved fixture.

expect('some string').to match_fixture('fixture_filename')

output_fixture - Compare STDOUT/STDERR

Compare an output (stdout or stderr) with a pre-approved fixture.

expect{ puts "hello" }.to output_fixture('fixture_filename')
expect{ puts "hello" }.to output_fixture('fixture_filename').to_stdout
expect{ $stderr.puts "hello" }.to output_fixture('fixture_filename').to_stderr

# The first two are the same, as the default stream is stdout.

diff - String Similarity

Adding diff(distance) to either match_fixture or output_fixture will change the matching behavior. Instead of expecting the strings to be exactly the same, using diff compares the strings using the Levenshtein distance algorithm.

In the below example, we allow up to 5 characters to be different.

expect('some string').to match_fixture('fixture_filename').diff(5)
expect{ puts 'some string' }.to output_fixture('fixture_filename').diff(5)

Configuration

interactive_fixtures

By default, interactive approvals are enabled in any environment that does not define the CI environment variable. You can change this by adding this to your spec_helper

RSpec.configure do |config|
  config.interactive_fixtures = false # or any logic
end

fixtures_path

By default, fixtures are stored in spec/fixtures. To change the path, add this to your spec_helper.

RSpec.configure do |config|
  config.fixtures_path = 'spec/anywhere/else'
end