如何解决Rails::TestUnitReporter 找不到 MiniTest::Result 测试的方法
运行 rails test
,Rails::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)
[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::Result
和 Rails::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.7
和 minitest-5.11.3
之间是否存在已知的不兼容问题,并确定我应该升级哪一个。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。