繁体   English   中英

rspec中的参数数目错误(1代表0)

[英]wrong number of arguments (1 for 0) in rspec

在向收入模型添加自定义验证后,我的测试出现了一些问题。

@member.incomes << [Income.new(starting_date: '2015-01-01', amount: 1200, member: @member), 
                    Income.new(starting_date: '2015-04-01', amount: 1400, member: @member)]

我收到以下错误: wrong number of arguments (1 for 0)错误wrong number of arguments (1 for 0)

我对debugger观察:
第一条记录已正确插入,但第二条记录出现错误。

我做错了-有什么主意吗?

更新:
concat方法在这里无济于事。

更多代码:

income.rb
validate :newly_added_income_is_also_the_newest?
....
..
def newly_added_income_is_also_the_newest?
  latest_income = Income.where(member: member_id).select{|i|i}.max(&:starting_date)
  return true if latest_income.nil?
  if !latest_income.nil? && latest_income.starting_date >= starting_date
    errors.add(:income, "newest income should be also the latest income of the member '#{member.full_name}''")
  end
end

测试:[预算]应该获得介于start_date和end_date之间的所有收入

@member.incomes.concat[Income.new(starting_date: '2015-01-01', amount: 1200, member: @member),
                            Income.new(starting_date: '2015-04-01', amount: 1400, member: @member)]
     budget = FactoryGirl.create(:budget, donation: @donation, member: @member)
     expect(budget.get_all_incomes_for_budget_duration.size).to eq(3) 

日志1

    1) Budget Tests with a budget based donation types [Budget] should get all incomes which are in between of the start_date and end_date
         Failure/Error: @member.incomes.concat[Income.new(starting_date: '2015-01-01', amount: 1200, member: @member),
         TypeError:
           no implicit conversion of Income into Integer
         # ./spec/models/budget_spec.rb:44:in `[]'
         # ./spec/models/budget_spec.rb:44:in `block (3 levels) in <top (required)>'  

test2:[预算]应该获得预算范围之间收入变动的适应性承诺(失败-2)

it '[Budget] should get an adapted promise for income change between the budget range', skip_before: true do
   Member.delete_all
   Donation.delete_all
   member = FactoryGirl.create(:member)
   donation = FactoryGirl.create(:majlis_khuddam_donation)
   #income = FactoryGirl.create(:income, member: member)

   member.incomes << Income.new(starting_date: '2015-01-01', amount: 1200, member_id: 12345) <<
       Income.new(starting_date: '2015-03-01', amount: 1000, member_id: 12345)

   budget = FactoryGirl.create(:budget, donation: donation, member: member)

   expect(budget.promise).to eq(123)
 end

日志2

  2) Budget Tests with a budget based donation types [Budget] should get an adapted promise for income change between the budget range
       Failure/Error: Income.new(starting_date: '2015-03-01', amount: 1000, member_id: 12345)
       ArgumentError:
         wrong number of arguments (1 for 0)
       # /Users/user/.rvm/gems/ruby-2.2.0@maalify/gems/activerecord-4.2.0/lib/active_record/attribute_methods.rb:48:in `__temp__374716274796e676f546164756'
       # ./app/models/income.rb:22:in `each'
       # ./app/models/income.rb:22:in `max'
       # ./app/models/income.rb:22:in `newly_added_income_is_also_the_newest?'

我相信错误发生在这里:

latest_income = Income.where(member: member_id).select{|i|i}.max(&:starting_date)

maxEnumerable定义的方法。 它不带参数,因此显示消息“参数数量错误(1表示0)”。

您可能想要在ActiveRecord中定义的maximum方法。 它采用列名:

latest_income = Income.where(member: member_id).maximum(:starting_date)

<<push的简写,但我认为在这种情况下,您要么想要实现(如@mudasobwa所述)

@member.incomes << Income.new(...) << Income.new(...)

分别推送两个新实例,或尝试

@member.incomes.concat [Income.new(...), Income.new(...)]

如果要“合并”两个数组

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM