【问题标题】:rspec Object.new does not invoke initialize correctlyrspec Object.new 未正确调用初始化
【发布时间】:2019-05-13 17:31:16
【问题描述】:
module BusinessMath
  class Cashflows
    include Newton

    attr_accessor :cashflows

    def initialize(cashflows)
      @cashflows = rectify_cashflows(cashflows)
    end

    private

    def rectify_cashflows(cashflows)
      cashflows.sort_by! { |cashflow| cashflow[:date] }

      cashflows.each do |cashflow|
        cashflow[:delta] = 0 if cashflow[:date] == cashflows.first[:date]
        cashflow[:delta] = Date.range_360(cashflows.first[:date], cashflow[:date])
      end

      cashflows
    end
  end
end

# spec
before(:all) do
  @payload = [
    { date: Date.parse('1.1.2018'), amount: -100 },
    { date: Date.parse('1.6.2018'), amount: -50 },
    { date: Date.parse('1.1.2019'), amount: 150 }
   ]
end

describe '.initialize' do
  let(:object) { BusinessMath::Cashflows.new(@payload) }

  it 'sets @cashflows' do
    expect(object.cashflows).to eq(@payload)
  end
end

这个测试应该会失败,因为rectify_cashflows 对现金流进行排序并在每个现金流中添加一个delta 键。预期的和在控制台中工作的.cashflow 看起来像这样:

[
  { date: Date.parse('1.1.2018'), amount: -100, delta: 0 },
  { date: Date.parse('1.6.2018'), amount: -50, delta: 180},
  { date: Date.parse('1.1.2019'), amount: 150, delta: 360}
]

我怎样才能以正确的方式测试它?

【问题讨论】:

  • 你是对的@Stefan 在原始代码和这个示例之间切换时感到困惑:)
  • 您的示例代码运行良好。好像你已经编辑了错误。
  • 疯狂猜测:initialize 中的错字?
  • @Stefan:那么它不会在控制台中工作。我的猜测是:spring 挂了,没有重新加载代码。
  • 你修改了rectify_cashflows中传入的hash,所以object.cashflows@payload是同一个对象。

标签: ruby rspec initializer


【解决方案1】:

这个测试应该失败,因为rectify_cashflows 对它们进行排序并在每个现金流中添加一个delta 键。

是的。问题是,您的 rectify 方法也会影响您的规范中的@payload。因为它是完全相同的数组(包含相同的哈希)。自然地,一个对象等于它自己并且你的测试通过了。

一个简单的解决方法是使用复制sort 而不是就地sort!。或者,更好的是,简单地在初始化程序中深度复制数组。 (深层很重要)

【讨论】:

  • 今天我要回家了(╯°□°)╯︵ ┻━┻ 谢谢现在一切都说得通了。抱歉问题的开头一团糟。
猜你喜欢
  • 1970-01-01
  • 2020-04-21
  • 2012-06-17
  • 2022-01-22
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多