Как мне издеваться над классом с инициализированными методами, используя Rspec? - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь попрактиковаться в использовании двойников и насмешек в моих тестах Rspec, чтобы изолировать мои зависимости. На данный момент я делаю простую банковскую программу, которая имеет 2 класса - класс Account, отвечающий за логику транзакции, такую ​​как обновление баланса, кредитование, дебетование и т. Д. У меня также есть класс Statement, отвечающий за форматирование выписки по счету на основе история транзакций

Класс Моя учетная запись инициализируется следующим образом:

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

Класс My Statement инициализируется следующим образом:

  def initialize
    @display = []
  end

(Массив отображения - это массив массивов транзакций, которые являются всеми транзакциями, которые произошли в этой конкретной учетной записи).

В моем файле Statement_spec.rb я хочу использовать двойной класс класса Account. Как настроить двойной аккаунт, в котором уже есть выписка с полным отображением? На данный момент у меня есть:

account = double(Account.new(statement = statement)) но я хочу убедиться, что на дисплее есть транзакции, чтобы я мог протестировать методы класса Statement с поддельной, работающей учетной записью?

Извините, если я не объяснил это очень четко. Изо всех сил пытаясь заставить меня высмеивать насмешки, поэтому любая помощь действительно приветствуется! Спасибо :)

UPDATE: Метод, который я тестирую, таков:

  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 голосов
/ 06 июня 2019

Ваш тест делает гораздо больше, чем говорит.Он только ожидает, что строка будет иметь определенный формат, но он выполняет дополнительную работу.Я бы протестировал разные вещи:

ваш 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

и в спецификации вашего аккаунта (я не знаю ваш реальный код, это просто чтобы дать вам идею разбитьspecs)

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

Теперь спецификация выписки не заботится о счетах, и у спецификации аккаунта, связанной с выпиской, есть реальный оператор для работы.

...