如何使用Rspec模拟具有初始化方法的类?

时间:2019-06-05 06:48:49

标签: ruby rspec mocking double

我试图在Rspec测试中练习使用双打和模拟,以隔离依赖项。目前,我正在制作一个简单的银行程序,该程序有2个类-帐户类,负责交易逻辑,如更新余额,贷记,借方等。我还有一个对帐单类,负责根据帐户交易记录。

我的帐户类的初始化如下:

def initialize(statement = Statement.new)
    @balance = 0.00
    @credit = ''
    @debit = ''
    @date = Date.today.strftime('%d/%m/%Y')
    @transaction = []
    @statement = statement
end

我的Statement类的初始化如下:

  def initialize
    @display = []
  end

(显示数组是交易数组的数组,交易数组是该特定帐户中发生的所有交易)。

在我的statement_spec.rb文件中,我想使用Account类的两倍。如何设置已经有完整显示对帐单的帐户双?目前,我有:

account = double(Account.new(statement = statement)),但是我想确保显示中包含事务,因此我可以使用伪造且正常运行的帐户测试Statement类方法?

很抱歉,如果我没有清楚地说明这一点。竭尽全力去嘲弄我,所以我们将不胜感激!谢谢:)

更新: 我正在测试的方法是这样的:

  def format
    puts 'date || credit || debit || balance'
    @display.map do |transaction|
      return @display.join(' || ')
    end
  end

当前测试是这样:

  describe '#format' do
    it 'prints the statement as a table' do
      account = Account.new
      account.deposit(15.00)
      account.complete_transaction
      expect(account.statement.format).to eq Date.today.strftime('%d/%m/%Y') + ' || 15.00 ||  || 15.00'
    end
  end

1 个答案:

答案 0 :(得分:0)

您的测试比它说的要做的要多得多。它只希望字符串具有某些格式,但是会做更多的工作。我会测试不同的东西:

您的statement_spec.rb

describe '.format' do
  it 'returns the statement as a table' do
    statement = Statement.new
    statement.display = [15.00, 0, 15.00]
    expect(statement.format).to eq Date.today.strftime('%d/%m/%Y') + ' || 15.00 ||  || 15.00'
  end
end

以及您的帐户规格(我不知道您的实际代码,只是为了让您了解拆分规格的想法)

describe 'it sets statement display values' do
  account = Account.new
  account.deposit(15.00)
  expect(account.statement.display).to include 15.00
end

现在,对帐单规范不关心帐户,并且与de statement相关的帐户对帐单具有真实的对帐单。