微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rails::TestUnitReporter 找不到 MiniTest::Result 测试的方法

如何解决Rails::TestUnitReporter 找不到 MiniTest::Result 测试的方法

运行 rails testRails::TestUnitReporter 无法获取 MiniTest::Result 测试的源位置。 MiniTest::Result 的结构不是 Rails::TestUnitReporter 所期望的。

/usr/local/rvm/gems/railties-5.0.7/lib/rails/test_unit/reporter.rb:71`:in `method': undefined method `test_It_calcualtes_late_fees_correctly' for class `Minitest::Result' (NameError)

插入一个byebug调用,我看到了:

[66,75] in /usr/local/rvm/gems/ruby-2.3.1/gems/railties-5.0.7/lib/rails/test_unit/reporter.rb
   66:         "%s#%s = %.2f s = %s" % [result.class,result.name,result.time,result.result_code]
   67:       end
   68: 
   69:       def format_rerun_snippet(result)
   70:         byebug if not Rails.env.production?
=> 71:         location,line = result.method(result.name).source_location
   72:         "#{self.executable} #{relative_path_for(location)}:#{line}"
   73:       end
   74: 
   75:       def app_root

(byebug) results.first.source_location
["/home/xxx/code/prj/test/models/invoice_template_test.rb",9]

我的测试:

 4 class InvoiceTemplateTest < ActiveSupport::TestCase
  5     test "the truth" do
  6       assert true
  7     end
  8 
  9     test "It calcualtes late fees correctly" do
 10         tests = {
 11             fixed_fee: {
 12                 feePolicy: '10.0 $ > 50',13                 pastDue: 52.0,[...]
 25             },26             decimal_fee: {
 27                 feePolicy: '0.1',28                 pastDue: 24.4,29                 expectedFee: 2.44,30             },31         }
 32 
  33         tests.each {|scenario,parameters|
 34             policy = parameters[:feePolicy]
 35             it = InvoiceTemplate.new(late_fee: policy)
 36 
 37             expected = parameters[:expectedFee]
 38             actual = it.calculateLateFee(parameters[:pastDue])
 39             msg = "For scenario #{scenario.to_s},expected #{expected} and got #{actual}"
 40             assert_in_delta(expected,actual,0.001,msg)
 41         }
 42 
 43     end
 44 end

如果我注释掉 "It calcualtes late fees correctly",它会正确运行 "the truth"

$ rvm 2.3.1 do rails test 
Running via Spring preloader in process 10308
Run options: --seed 37453

# Running:

.

Finished in 0.003080s,324.6650 runs/s,324.6650 assertions/s.
1 runs,1 assertions,0 failures,0 errors,0 skips
$ 

运行测试没有问题,只是无法从他们那里干净利落地报告。使用 assert false 插入测试,我得到同样的错误

  9     test "the false" do
 10       assert false
 11     end
$ rvm 2.3.1 do rails test                                                                                                                                                      
Running via Spring preloader in process 16606
Run options: --seed 30320

# Running:

F

Failure:
InvoiceTemplateTest#test_the_false [/home/xxx/code/prj/test/models/invoice_template_test.rb:10]:
Expected false to be truthy.



[66,line = result.method(result.name).source_location
   72:         "#{self.executable} #{relative_path_for(location)}:#{line}"
   73:       end
   74: 
   75:       def app_root
(byebug) c
/usr/local/rvm/gems/ruby-2.3.1/gems/railties-5.0.7/lib/rails/test_unit/reporter.rb:71:in `method': undefined method `test_the_false' for class `Minitest::Result' (NameError)

我不认为这是双 gems 目录,它在整个堆栈跟踪的同一安装中运行:

lusk 10:24:39 {t15209_railsUnitTest} ~/code/prj/test$ rvm 2.3.1 do rails test                                                                                                                                                 
Running via Spring preloader in process 11485
Run options: --seed 58861

# Running:

F

Failure:
InvoiceTemplateTest#test_It_calcualtes_late_fees_correctly [/home/xxx/code/prj/test/models/invoice_template_test.rb:40]:
For scenario minimum,expected 0.0 and got 10.0.
Expected |0.0 - 10.0| (10.0) to be <= 0.001.



[66,line = result.method(result.name).source_location
   72:         "#{self.executable} #{relative_path_for(location)}:#{line}"
   73:       end
   74: 
   75:       def app_root
(byebug) c
/usr/local/rvm/gems/ruby-2.3.1/gems/railties-5.0.7/lib/rails/test_unit/reporter.rb:71:in `method': undefined method `test_It_calcualtes_late_fees_correctly' for class `Minitest::Result' (NameError)
        from /usr/local/rvm/gems/ruby-2.3.1/gems/railties-5.0.7/lib/rails/test_unit/reporter.rb:71:in `format_rerun_snippet'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/railties-5.0.7/lib/rails/test_unit/reporter.rb:23:in `record'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:803:in `block in record'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:802:in `each'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:802:in `record'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:334:in `run_one_method'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:321:in `block (2 levels) in run'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:320:in `each'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:320:in `block in run'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:360:in `on_signal'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:347:in `with_info_handler'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:319:in `run'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/railties-5.0.7/lib/rails/test_unit/line_filtering.rb:9:in `run'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:159:in `block in __run'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:159:in `map'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:159:in `__run'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:136:in `run'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb:63:in `block in autorun'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/application.rb:171:in `fork'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/application.rb:171:in `serve'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/application.rb:141:in `block in run'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/application.rb:135:in `loop'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/application.rb:135:in `run'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/spring-2.0.2/lib/spring/application/boot.rb:19:in `<top (required)>'
        from /usr/local/rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /usr/local/rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from -e:1:in `<main>'

如果我包含 rails_helper,我会遇到更多冲突,似乎是 Rails 内部的:

$ rvmDo rails test                                     
/usr/local/rvm/gems/ruby-2.3.1/gems/rails_helper-2.2.2/lib/rails_helper.rb:138:in `block in <class:Engine>': undefined method `install_helpers' for #<Actiondispatch::Routing::RouteSet:0x000000055c1b10>
Did you mean?  instance_values (NoMethodError)
        from /usr/local/rvm/gems/ruby-2.3.1/gems/activesupport-5.0.7/lib/active_support/lazy_load_hooks.rb:67:in `block in execute_hook'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/activesupport-5.0.7/lib/active_support/lazy_load_hooks.rb:60:in `with_execution_control'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/activesupport-5.0.7/lib/active_support/lazy_load_hooks.rb:65:in `execute_hook'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/activesupport-5.0.7/lib/active_support/lazy_load_hooks.rb:50:in `block in run_load_hooks'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/activesupport-5.0.7/lib/active_support/lazy_load_hooks.rb:49:in `each'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/activesupport-5.0.7/lib/active_support/lazy_load_hooks.rb:49:in `run_load_hooks'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/railties-5.0.7/lib/rails/application/finisher.rb:65:in `block in <module:Finisher>'
        from /usr/local/rvm/gems/ruby-2.3.1/gems/railties-5.0.7/lib/rails/initializable.rb:30:in `instance_exec'

我认为双堆叠 gem 安装可能是由于 MiniTest::ResultRails::TestUnitReporter 之间不兼容造成的。但是在我重新安装我的整个 rvm、rails 和 ruby​​ 安装之前,我应该尝试使用 bundle update --conservative gem-name 升级任何 gem 吗?

更新:进一步研究我正在运行的两个版本和哪个 gem:

(byebug) list=

[66,line = result.method(result.name).source_location
   72:         "#{self.executable} #{relative_path_for(location)}:#{line}"
   73:       end
   74: 
   75:       def app_root

(byebug) Minitest::Result.singleton_methods.map{|m| Minitest::Result.method(m).source_location[0]}.uniq

["/usr/local/rvm/gems/ruby-2.3.1/gems/minitest-5.11.3/lib/minitest.rb","/usr/local/rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/psych/core_ext.rb"]

所以它们都来自 /usr/local/rvm/gems/ruby-2.3.1/ 内部。我将查看 railties-5.0.7minitest-5.11.3 之间是否存在已知的不兼容问题,并确定我应该升级一个

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。