我如何获得RSpec的共享示例,例如Ruby Test :: Unit中的行为?

时间:2013-01-24 17:17:31

标签: ruby rspec testunit minitest

在RSpec for Test :: Unit测试中是否有类似于shared_examples的插件/扩展名?

5 个答案:

答案 0 :(得分:3)

如果您使用的是rails(或只是active_support),请使用Concern

require 'active_support/concern'

module SharedTests
  extend ActiveSupport::Concern

  included do

    # This way, test name can be a string :)
    test 'banana banana banana' do
      assert true
    end

  end
end

如果您未使用active_support,请使用Module#class_eval

这种技术建立在Andy H.的答案之上,他指出:

  

Test ::单元测试只是Ruby类,因此您可以使用代码重用的[常规技术]

但因为它允许使用ActiveSupport::Testing::Declarative#test,所以它的优点是不会磨损你的下划线键:)

答案 1 :(得分:2)

我能够使用以下代码实现共享测试(类似于RSpec共享示例):

module SharedTests
  def shared_test_for(test_name, &block)
    @@shared_tests ||= {}
    @@shared_tests[test_name] = block
  end

  def shared_test(test_name, scenario, *args)
    define_method "test_#{test_name}_for_#{scenario}" do
      instance_exec *args, &@@shared_tests[test_name]
    end
  end
end

在Test :: Unit测试中定义和使用共享测试:

class BookTest < ActiveSupport::TestCase
  extend SharedTests

  shared_test_for "validate_presence" do |attr_name|
    assert_false Books.new(valid_attrs.merge(attr_name => nil)).valid?
  end

  shared_test "validate_presence", 'foo', :foo
  shared_test "validate_presence", 'bar', :bar
end

答案 2 :(得分:1)

Test::Unit测试只是Ruby类,因此您可以使用与任何其他Ruby类相同的代码重用方法。

要编写共享示例,您可以使用模块。

module SharedExamplesForAThing
  def test_a_thing_does_something
    ...
  end
end

class ThingTest < Test::Unit::TestCase
  include SharedExamplesForAThing
end

答案 3 :(得分:0)

require 'minitest/unit'
require 'minitest/spec'
require 'minitest/autorun'

#shared tests in proc/lambda/->
basics = -> do
  describe 'other tests' do
    #override variables if necessary
    before do
      @var  = false
      @var3 = true
    end

    it 'should still make sense' do
      @var.must_equal false
      @var2.must_equal true
      @var3.must_equal true
    end
  end
end

describe 'my tests' do

  before do
    @var = true
    @var2 = true
  end

  it "should make sense" do
    @var.must_equal true
    @var2.must_equal true
  end

  #call shared tests here
  basics.call
end

答案 4 :(得分:0)

看看我几年前写的这个要点。它仍然很有效:https://gist.github.com/jodosha/1560208

# adapter_test.rb
require 'test_helper'

shared_examples_for 'An Adapter' do
  describe '#read' do
    # ...
  end
end

像这样使用:

# memory_test.rb
require 'test_helper'

describe Memory do
  it_behaves_like 'An Adapter'
end