rspec Object.new не вызывает инициализацию правильно - PullRequest
0 голосов
/ 12 декабря 2018
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 Ответ

0 голосов
/ 12 декабря 2018

Этот тест не пройден, поскольку rectify_cashflows сортирует их и добавляет ключ delta в каждый денежный поток.

Да.Проблема в том, что ваш метод исправления влияет на @payload из вашей спецификации тоже.Потому что это тот же массив (содержащий те же хеши).Естественно, объект равен себе и ваш тест успешно пройден.

Простым решением было бы использование копирования sort вместо sort! на месте.Или, лучше, просто скопируйте массив в инициализаторе.(важна глубокая часть)

...