代码之家  ›  专栏  ›  技术社区  ›  Denny Mueller

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

  •  0
  • Denny Mueller  · 技术社区  · 6 年前
    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}
    ]
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   Sergio Tulentsev    6 年前

    rectify_cashflows 对它们进行排序并添加 delta 输入每个现金流。

    对问题是,你的矫正方法会影响 @payload 完全相同的数组 (包含相同的散列)。当然,一个对象等于它自己,并且您的测试通过了。

    一个简单的解决方法是使用复制 sort sort! . 或者,更好的方法是在初始值设定项中深度复制数组(深度部分很重要)