Как проверить ассоциации в rspec, используя gem musta-matchers? - PullRequest
0 голосов
/ 13 ноября 2018

Здравствуйте, я учусь тестировать приложение rails с помощью rspec.Я тестирую банковское приложение, в котором транзакция принадлежит счету.Я тестирую модель транзакции.Это код выглядит следующим образом: Transaction.rb:

class Transaction < ApplicationRecord
      validates :amount, presence: true, numericality: {  only_integer: true,
                                                          greater_than: 0 }
      after_create :update_balance
      belongs_to :account

     def update_balance
       if transaction_type == 'debit'
         account.current_balance -= amount
       else
         account.current_balance += amount
       end
    end
end

И его спецификации таковы:

require 'rails_helper'
RSpec.describe Transaction, type: :model do
  it { should belong_to(:account)}

  subject {
    described_class.new(amount: 60, transaction_type: 'credit',
                        id: 1,
                        created_at: DateTime.now, updated_at: DateTime.now,
                        account_id: 1)
  }

  it 'is valid with valid attributes' do
    expect(subject).to be_valid
  end

  it 'is not valid without amount' do
    subject.amount = nil
    expect(subject).to_not be_valid
  end

  it 'is not valid without transaction type' do
    subject.transaction_type = nil
    expect(subject).to_not be_valid
  end

  it 'is not valid without created_at date' do
    subject.created_at = nil
    expect(subject).to_not be_valid
  end

  it 'is not valid without updated_at date' do
    subject.updated_at = nil
    expect(subject).to_not be_valid
  end

  it 'is not valid without transaction id' do
    subject.id = nil
    expect(subject).to_not be_valid
  end

  it 'is not valid without account id' do
    subject.id = nil
    expect(subject).to_not be_valid
  end
end

Я использовал камень musta для ассоциации.Однако, когда я запускаю этот тест, он выдает ошибку, поскольку «учетная запись должна существовать», даже если я добавил ассоциацию.

Ошибка:

.F......

Failures:

  1) Transaction is valid with valid attributes
     Failure/Error: expect(subject).to be_valid
       expected #<Transaction id: 1, transaction_type: "credit", amount: 0.6e2, created_at: "2018-11-13 10:33:13", updated_at: "2018-11-13 10:33:13", account_id: 1> to be valid, but got errors: Account must exist
     # ./spec/models/transaction_spec.rb:12:in `block (2 levels) in <top (required)>'

Finished in 0.02937 seconds (files took 0.77127 seconds to load)
8 examples, 1 failure

Может кто-нибудь помочь понять, что я делаю не так?

PS: В таблице транзакций есть столбец account_id для ассоциации.

Спасибо заранее.

1 Ответ

0 голосов
/ 13 ноября 2018

В Rails 5 по умолчанию требуются ассоциации, определенные как belongs_to. Поэтому, когда вы проверяете expect(subject).to be_valid, вызов valid? возвращает ложь, потому что у вас не установлена ​​учетная запись.

Ваш подход к работе ваших тестов будет зависеть от того, как вы хотите, чтобы объектная модель вашего приложения выглядела.

Если транзакция может существовать без учетной записи, настройте ассоциацию следующим образом:

class Transaction < ApplicationRecord
  belongs_to :account, optional: true
end

Однако я думаю, что более вероятно, что транзакция без счета не имеет смысла. Таким образом, ваш текущий тест на самом деле верен - когда вы тестируете транзакцию без учетной записи, она не действительна.

В этом случае вы можете настроить тестируемый объект соответствующим образом:

RSpec.describe Transaction, type: :model do
  let(:account) { Account.new }
  subject {
    described_class.new( ..., account: account)
  }
  ...
end
...