我有一个类似的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
。还有其他问题可以帮助我找到解决方案吗?
我花了一段时间,但我可以将问题缩小到这个失败的测试:
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
)是从其他地方调用的。