assert_value

Gem Version Build Status

Checks that two values are same and "magically" replaces expected value with the actual in case the new behavior (and new actual value) is correct. Support two kind of arguments: string and code block.

This check works with both Test/Unit and RSpec. See documentation and examples below:

Testing String Values

It is better to start with no expected value

assert_value "foo"

Then run tests as usual with "rake test". As a result you will see diff between expected and actual values:

Failure:
@@ -1,0, +1,1 @@
+foo
Accept the new value: yes to all, no to all, yes, no? [Y/N/y/n] (y):

If you accept the new value your test will be automatically modified to

assert_value "foo", <<-END
    foo
END

Testing Block Values

assert_value can take code block as an argument. If executed block raises exception then exception message is returned as actual value:

assert_value do
    nil+1
end

Run tests

Failure:
@@ -1,0, +1,1 @@
+Exception NoMethodError: undefined method `+' for nil:NilClass
Accept the new value: yes to all, no to all, yes, no? [Y/N/y/n] (y): 

After the new value is accepted you get

assert_value(<<-END) do
    Exception NoMethodError: undefined method `+' for nil:NilClass
END
    nil + 1
end

Testing Values Stored in Files

Sometimes test string is too large to be inlined into the test source. Put it into the file instead:

assert_value "foo", log: 'test/log/reference.txt'

Additional Test/Unit Options:

--no-interactive skips all questions and just reports failures
--autoaccept prints diffs and automatically accepts all new actual values
--no-canonicalize turns off expected and actual value canonicalization (see below for details)

Additional options can be passed during both single test file run and rake test run:

In Ruby 1.8:

ruby test/unit/foo_test.rb -- --autoaccept
rake test TESTOPTS="-- --autoaccept"

In Ruby 1.9:

ruby test/unit/foo_test.rb --autoaccept
rake test TESTOPTS="--autoaccept"

RSpec

In specs you can either call assert_value directly or use "be_same_value_as" matcher:

describe "spec with be_same_value_as matcher" do
    it "compares with inline value" do
        expect("foo").to be_same_value_as <<-END
            foo
        END
    end

    it "compares with inline block" do
        expect { "foo" }.to be_same_value_as <<-END
            foo
        END
    end

    it "compares with value in file" do
        expect("foo").to be_same_value_as(:log => 'test/logs/assert_value_with_files.log.ref')
    end
end

Canonicalization:

Before comparing expected and actual strings, assert_value canonicalizes both using these rules:

  • indentation is ignored (except for indentation relative to the first line of the expected/actual string)
  • ruby-style comments after "#" are ignored
  • empty lines are ignored
  • trailing whitespaces are ignored

You can turn canonicalization off with --no-canonicalize option. This is useful when you need to regenerate expected test strings. To regenerate the whole test suite, run:

In Ruby 1.8:

rake test TESTOPTS="-- --no-canonicalize --autoaccept"

In Ruby 1.9:

rake test TESTOPTS="--no-canonicalize --autoaccept"

Supported Rubies and Test Frameworks

Framework / Ruby 1.8.7 1.9.3 2.0+
Test-Unit (bundled) Yes No No
Minitest (bundled) No Yes No
Test-Unit (latest) No No Yes
Minitest (latest) No No Yes
Rspec 2.99 Yes Yes No
Rspec (latest) Yes Yes Yes
  • ruby 1,8.7 came with bundled Test-unit 1.2.3 and cannot run latest Test-Unit and Minitest frameworks
  • ruby 1.9.3 came with bundled Minitest 2.5.1 and cannot run other Test-Unit and MInitest frameworks
  • RSpec 2.99 is the latest RSpec framework compatible with Rails 2.3

Development

One way to setup development environment using rbenv:

# compile ruby
rbenv install 2.3.0

# set local version of ruby under rbenv
rbenv local 2.3.0

# install bundler
gem install bundle

# configure bundler
bundle config --local path .bundle/gems
bundle config --local bin .bundle/bin    # binstubs
bundle config   # to see current settings

# below seems to be necessary, having a Gemfile in
# subdirectory like
#    bundle config --local gemfile gemfiles/test-unit.bundled.gemfile
# breaks tests in old rubies
ln -s gemfiles/test-unit.bundled.gemfile Gemfile

# install gems
bundle install

Run Tests

Test-Unit and Minitest

bundle exec rake test

RSpec 2.99

bundle exec rspec test

RSpec 3+

bundle exec rake spec

Building The Gem

gem build assert_value.gemspec
ls assert_value-*.gem
gem push assert_value-*.gem

Changelog

  • 1.5: Improve support for various testing frameworks and Ruby versions: Ruby 2.2.2, 2.2.3, RSpec 2.x, 3.x, Test::Unit 2.x, 3.x, Minitest 4.x, 5.x
  • 1.4: Fix RSpec support
  • 1.3: Improve support for various testing frameworks, fix assertion counters
  • 1.2: Rails 4.1 and minitest gem support
  • 1.1: RSpec support
  • 1.0: Rename to assert_value
  • 0.7: Support Ruby 1.9's MiniTest
  • 0.6: Support test execution on Mac
  • 0.5: Support code blocks to assert_same
  • 0.4: Added support for code blocks as argument
  • 0.3: Ruby 1.9 is supported
  • 0.2: Make assert_same useful as a standalone gem. Bugfixes
  • 0.1: Initial release