rspec Object.new 没有正确调用初始化
rspec Object.new does not invoke initialize correctly
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}
]
我怎样才能以正确的方式测试它?
This test should fail since rectify_cashflows
sorts them and adds a delta
key in each cashflow.
是的。问题是,您的纠正方法也会影响您规范中的 @payload
。因为它是 完全相同的数组 (包含相同的散列)。自然地,一个对象等于它自己并且你的测试通过了。
一个简单的解决方法是使用复制 sort
而不是就地 sort!
。或者,更好的是,简单地在初始化程序中深度复制数组。 (深层很重要)
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}
]
我怎样才能以正确的方式测试它?
This test should fail since
rectify_cashflows
sorts them and adds adelta
key in each cashflow.
是的。问题是,您的纠正方法也会影响您规范中的 @payload
。因为它是 完全相同的数组 (包含相同的散列)。自然地,一个对象等于它自己并且你的测试通过了。
一个简单的解决方法是使用复制 sort
而不是就地 sort!
。或者,更好的是,简单地在初始化程序中深度复制数组。 (深层很重要)