Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby rspec Object.new未正确调用初始化_Ruby_Rspec_Initializer - Fatal编程技术网

Ruby rspec Object.new未正确调用初始化

Ruby rspec Object.new未正确调用初始化,ruby,rspec,initializer,Ruby,Rspec,Initializer,由于correct\u cashflows对现金流进行排序,并在每个现金流中添加一个delta键,因此该测试应该失败。预期和控制台内工作的.cashflow如下所示: module BusinessMath class Cashflows include Newton attr_accessor :cashflows def initialize(cashflows) @cashflows = rectify_cashflows(cashflows)

由于
correct\u cashflows
对现金流进行排序,并在每个现金流中添加一个
delta
键,因此该测试应该失败。预期和控制台内工作的
.cashflow
如下所示:

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
我怎样才能用正确的方法测试它

此测试应失败,因为
correct_现金流
对其进行排序,并在每个现金流中添加一个
delta

对。问题是,您的校正方法也会影响规范中的
@payload
。因为它是非常相同的数组(包含相同的散列)。当然,一个对象等于它自己,并且您的测试通过了


一个简单的解决方法是使用复制
排序
而不是就地
排序。或者,更好的方法是在初始值设定项中深度复制数组。(深层次的部分很重要)

你说得对@Stefan在原始代码和这个示例之间切换时感到困惑:)你的示例代码工作得很好。似乎您已经编辑掉了错误。胡乱猜测:
initialize
?@Stefan:那么它在控制台中就不起作用了。我的猜测是:spring挂起了,没有重新加载代码。您修改了
corrective\u cashflows
中传入的哈希,因此
对象。cashflows
@payload
是同一个对象。今天我将回家(╯°□°)╯︵ ┻━┻ 谢谢,现在一切都讲得通了。很抱歉问题的开头很混乱。
[
  { 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}
]