【问题标题】:rspec is not saving to the db a calculated valuerspec 没有将计算值保存到数据库
【发布时间】:2015-07-30 15:20:56
【问题描述】:

我正在编写的一项测试遇到问题。我有一个预算模型,其中承诺(列)是在回调 after_create 之后从名为 calculate_budget 的方法计算出来的。

在正常的开发模式下,应用程序正在保存到数据库中,但在当前测试中,我抓取了一些其他预算记录,其中承诺为 0 而不是计算的承诺。

这里有一些代码

before(:each) do
  @member1 = FactoryGirl.create(:member)
  @member2 = FactoryGirl.create(:member, id: "2")
  income = FactoryGirl.create(:income, member: @member1)
  donation1 = FactoryGirl.create(:donation1)
  donation2 = FactoryGirl.create(:donation2)
  @budget = FactoryGirl.create(:budget, donation: donation1, member: @member1)
end

...
..

it "description" do
  receipt1 = Receipt.create!(id: 1, date: '2015-01-01', member: @member1)
  receipt2 = Receipt.create!(id: 2, date: '2015-02-01', member: @member1)
  receipt1.items << ReceiptItem.create!(id: 1, donation_id: 1, amount: 10, receipt_id: 1)
  receipt2.items << ReceiptItem.create!(id: 2, donation_id: 1, amount: 20, receipt_id: 2)

  budget2 = FactoryGirl.create(:budget, title: 'budget2', start_date: '2016-01-01', end_date: '2016-12-31', donation_id: 1, member: @member1)

  ap "#budget promise => #{@budget.title} promise #{@budget.promise} remaining #{@budget.remainingPromiseCurrentBudget}"
  ap "#budget promise => #{budget2.title} promise #{budget2.promise} remaining #{budget2.remainingPromiseCurrentBudget}"

  @budget.save
  budget2.save

  ap Budget.all
  # debugger
  ap "budget2.get_all_old_budgets: #{budget2.get_all_old_budgets}"

  expect(budget2.remainingPromiseCurrentBudget).to be(210)
end

知道为什么没有正确保存记录吗?

更新

记录保存到测试数据库,但只是计算出的 promise 值,它没有更新/保存到测试数据库。如前所述,开发数据库正在将值正确保存到数据库。

【问题讨论】:

  • 我可以建议两件事:1. 在测试中使用save! - 我的意思是@budget.save!budget2.save! 2. 检查(并可能发布)你的方法remainingPromiseCurrentBudget - 也许有些东西缓存了价值。 PS 我在您的代码中没有看到 it 块。我希望你的帖子中没有提到这一点。
  • @gotva thx 的答案,但它对save! 没有帮助,我刚刚错过了it
  • remainingPromiseCurrentBudget 方法正确且没有错误

标签: ruby-on-rails-4 testing rspec factory-bot


【解决方案1】:

问题出在before(:each) 块中。

我现在添加了it'...', skip_before: true do 并在测试中直接复制了我的初始设置,而不是工厂女孩的create 方法,我使用了build 方法并在后记中保存了它。

之后,回调被触发,promise 被保存到数据库中。

经验教训:

在每个块之前使用构建方法并使用.save 手动保存它,而不是使用创建块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2014-02-09
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2014-11-26
    • 1970-01-01
    相关资源
    最近更新 更多