0

我有一个这样的 MiniTest:

describe Message do
  describe "#is_getting_unavailable" do
    let( :message ) { Message.new() }
    it "should be false when user does not exist in the database" do
      message.handle
      assert_equal(false, message.is_getting_unavailable)
    end
  end
end

运行这个让我抱怨assert_equal

Message::#is_getting_unavailable#test_0001_should be false when user does not exist in the database

ArgumentError: wrong number of arguments (2 for 0)
    test/unit/message_test.rb:148:in `(root)'
    org/jruby/RubyBasicObject.java:1703:in `__send__'
    org/jruby/RubyKernel.java:2209:in `send'
    org/jruby/RubyArray.java:1617:in `each'
    org/jruby/RubyArray.java:1617:in `each'

我不明白这一点,所以我包括了测试(就在调用之前assert_equal):

  puts method(:assert_equal).inspect
  puts method(:assert_equal).arity
  puts method(:assert_equal).source_location.inspect

输出是:

#<Method: #<Class:0x1d1e394d>(Minitest::Assertions)#assert_equal>
-3
["/home/rjung/.rvm/gems/jruby-1.7.4/gems/minitest-5.0.6/lib/minitest/assertions.rb", 155]

所以方法是正确的,arity也是正确的。这里有什么问题?

我们也使用rr, timecop。还有其他问题,可以帮助我找到解决方案吗?

4

1 回答 1

2

我花了一段时间,但我可以将问题缩小到这个失败的测试:

require 'minitest/autorun'

describe 'Message' do
  let( :message ) { Hash.new }

  it "should not fail awkwardly" do
    assert_equal false, message.nil?
  end
end

这个测试的输出是

  1) Error:
Message#test_0001_should not fail awkwardly:
ArgumentError: wrong number of arguments (2 for 0)
    test/unit/message_test.rb:7:in `(root)'
    org/jruby/RubyBasicObject.java:1703:in `__send__'
    org/jruby/RubyKernel.java:2209:in `send'
    org/jruby/RubyArray.java:1617:in `each'
    org/jruby/RubyArray.java:1617:in `each'

所以我为https://github.com/seattlerb/minitest/issues/343提交了一个错误。
Minitest 确实有一个message被覆盖的方法,所以不要message用作变量。

我仍然想知道的是,为什么堆栈跟踪说错误数量的参数发生在 中message_test.rb:7,因为不带参数 ( message) 的方法是从其他地方明确调用的。

于 2013-09-03T15:49:31.287 回答