【问题标题】:wrong number of arguments (1 for 0) in rspecrspec 中的参数数量错误(1 代表 0)
【发布时间】:2015-09-12 00:27:13
【问题描述】:

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

@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)

我对@9​​87654323@的观察:
第一条记录已正确插入,但第二条记录出错。

我做错了什么 - 知道吗?

更新:
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

test: [Budget] 应该得到所有介于 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) 

log1

    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:[Budget] 应该在预算范围 (FAILED - 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

log2

  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?'

【问题讨论】:

  • @member.incomes &lt;&lt; Income.new(...) &lt;&lt; Income.new(...) 不会解决问题吗?无论如何,请发布整个错误消息,尤其是方法名称。
  • 您需要显示引发错误的方法。

标签: ruby-on-rails ruby exception rspec


【解决方案1】:

我相信错误发生在这里:

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)

【讨论】:

  • 伟大的 +1 就是这样!我知道使用 ActiveRecord 推荐的 maximum 方法
【解决方案2】:

&lt;&lt;push 的简写,但我认为在这种情况下,您想要实现任何一个(正如@mudasobwa 所说)

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

单独推送两个新实例,或者尝试

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

如果你想“合并”两个数组

【讨论】:

  • 它没有解决问题,我添加了更多代码@mudasobwa
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多