如何在 Ruby 2.2 上运行现有的测试代码

Posted

技术标签:

【中文标题】如何在 Ruby 2.2 上运行现有的测试代码【英文标题】:How to run existing test code on Ruby 2.2 【发布时间】:2015-03-30 21:09:51 【问题描述】:

以下代码(没有 Gemfile)适用于 Ruby 2.1.1,但不适用于 Ruby 2.2.0

require "bundler/setup"
gem "minitest", "4.7.5"
require "test/unit"

class TestFoo < Test::Unit::TestCase
  def test_foo
    assert true, "Useless mesage"
    skip "Skip works"
  end
end

在 Ruby 2.1.1 上,我得到了

Run options: 

# Running tests:

[1/1] TestFoo#test_foo = 0.00 s
  1) Skipped:
TestFoo#test_foo [test_220.rb:8]:
Skip works

Finished tests in 0.004435s, 225.4791 tests/s, 225.4791 assertions/s.
1 tests, 1 assertions, 0 failures, 0 errors, 1 skips

ruby -v: ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin10.0]

但是在 Ruby 2.2.0 上,我得到了

192-168-1-5:test_220 agrimm$ ruby test_220.rb 
Loaded suite test_220
Started
E
===============================================================================
Error: test_foo(TestFoo)
: NoMethodError: undefined method `skip' for #<TestFoo:0x007fb75484f158>
test_220.rb:8:in `test_foo'
      5: class TestFoo < Test::Unit::TestCase
      6:   def test_foo
      7:     assert true, "Useless mesage"
  =>  8:     skip "Skip works"
      9:   end
     10: end
===============================================================================


Finished in 0.001504 seconds.

1 tests, 1 assertions, 0 failures, 1 errors, 0 pendings, 0 omissions, 0 notifications
0% passed

664.89 tests/s, 664.89 assertions/s
$ ruby --version
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin13]

我怀疑这是因为changes associated with Ruby 2.2.0:

更新测试单元 3.0.8(从存储库中删除但捆绑在 压缩包)

更新 minitest 5.4.3(从存储库中删除但捆绑在 tarball 中)

如何让代码在 Ruby 2.2 上运行,最好是用最少的代码更改?

【问题讨论】:

【参考方案1】:

测试单元反向移植已被封装到一个 gem 中:test-unit-minitest

【讨论】:

【参考方案2】:

在 Ruby 2.2 之前,test/unit 只是对minitest 的一个薄包装。尽管您的测试用例继承自 Test::Unit::TestCase,但您实际上使用的是 minitest 断言。因此skip 起作用了,这是minitest 的一个特性。

标准的 Ruby 2.2 发行版捆绑了 test-unit 3.0.8minitest 5.4.3,但不包括以前存在的集成。请注意,它们实际上是 2 个独立的测试框架 - 本质上是两个独立的 gem。

我提出 2 个选项:

1。使用test-unit - rubydoc

您的测试可以保留Test::Unit::TestCase 基类,但您需要调整断言以使用test-unit 的。

例如,将skip 替换为omit

require "test/unit"

class TestFoo < Test::Unit::TestCase
  def test_foo
    assert true, "Useless mesage"
    omit "Omit works"
  end
end

2。使用minitest - rubydoc

您将继续使用您知道的断言,但您需要require "minitest/autorun" 并将基类切换为Minitest::Test

require "minitest/autorun"

class TestFoo < Minitest::Test
  def test_foo
    assert true, "Useless mesage"
    skip "Skip works"
  end
end

【讨论】:

以上是关于如何在 Ruby 2.2 上运行现有的测试代码的主要内容,如果未能解决你的问题,请参考以下文章

如何将测试人员添加到现有的 wp7 beta 应用程序

Play 2.2:使用 Play Caching (Scala) 对代码进行单元测试时出现问题

如何在现有的 ios 测试项目中启用 xcode 7 UI 测试

使用现有的 TestUnit 测试和 Simplecov 覆盖运行 RSpec

如何将测试添加到现有的 Typescript 项目,并让它显示在测试资源管理器中?

围绕现有的指定方法运行 ruby​​ 方法