"ArgumentError: wrong number of arguments (2 for 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也是正确的。这里有什么问题?

我们还使用了rrtimecop。还有其他问题可以帮助我找到解决方案吗?

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

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'

所以我申请了Bughttps://github.com/seattlerb/minitest/issues/343.
Minitest确实有一个方法message被覆盖,所以不要将message用作变量。

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

最新更新