Skip to content

Build specs based on intelligence gathered from spies in other specs

License

Notifications You must be signed in to change notification settings

ritchiey/rspec-varys

Repository files navigation

Gem Version Build Status Code Climate

Rspec::Varys

Generate RSpec specs from intelligence gathered from doubles and spies. This is an experiment to see if a top-down TDD work-flow can be improved by partially automating the creation of lower level specs.

When you define a test-double in your spec:

describe ExampleClass, "#max_margin_for" do
  it "returns the maximum margin for the supplied text" do
    allow(subject).to receive(:margin_for).and_return(2, 4)
    expect(subject.max_margin_for("  unindent line\n    indented line\n")).to eq(4)
  end
end

And your code calls it:

class ExampleClass
  def max_margin_for(text)
    text.split("\n").map {|line| margin_for(line)}.max
  end
end

Varys will generate the corresponding specs so you can verify the validity of your test-doubles:

# Generated by Varys:

describe ExampleClass, "#margin_for" do
  it "returns something" do
    confirm(subject).can receive(:margin_for).with("  unindent line").and_return(2)
    skip "remove this line once implemented"
    expect(subject.margin_for("  unindent line")).to eq(2)
  end
end

describe ExampleClass, "#margin_for" do
  it "returns something" do
    confirm(subject).can receive(:margin_for).with("    indented line").and_return(4)
    skip "remove this line once implemented"
    expect(subject.margin_for("    indented line")).to eq(4)
  end
end

Limitations

Varys is very early release software and it has many limitations. If you find one, please check the Github issues and add it if it's not already listed.

Installation

Add this line to your application's Gemfile:

gem 'rspec-varys'

And then execute:

$ bundle

Or install it yourself as:

$ gem install rspec-varys

Configuration

Add these lines to your spec/spec_helper.rb:

require "rspec/varys"
require "rspec/varys/rspec_generator"

RSpec.configure do |config|
  config.include RSpec::Varys::DSL

  config.before(:suite) do
    RSpec::Varys.reset
  end

  config.after(:suite) do
    # Required: create varys.yml
    RSpec::Varys.print_report

    # Optional: create generated_specs.yml from varys.yml
    RSpec::Varys::RSpecGenerator.run
  end
end

Usage

See the Cucumber features for examples of intended usage or watch this screencast for a simple tutorial.

Contributing

  1. Fork it ( https://github.com/ritchiey/rspec-varys/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

About

Build specs based on intelligence gathered from spies in other specs

Resources

License

Stars

Watchers

Forks

Packages

No packages published