RSpec: заглушка метода в файле определения фабричного бота - PullRequest
0 голосов
/ 29 марта 2019

У меня есть модель, которая использует attr_encrypted gem для шифрования пароля.

class Credential < ApplicationRecord
  validates :user_name, presence: true
  enum credential_type: { windows: 1, linux: 2 }

  attr_encrypted :user_pass, key: :encryption_key

  def encryption_key
    # Some complex logic
  end
end

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

FactoryBot.define do
  factory :credential do
    user_name { "rmishra" }
    user_pass { "secret" }
    credential_type { "linux" }
    encryption_key { "abcdefghijklmnopqrstuvw123456789" }
  end
end

Мой файл спецификаций выглядит так:

RSpec.describe Credential, type: :model do
  let(:credential) { create(:credential) }
  ...
end

Как мне заглушить метод encryption_key в определении фабрики, который используется во время create?

1 Ответ

0 голосов
/ 31 марта 2019

Поскольку encryption_key не является атрибутом в вашей модели, вы не можете настроить его на своей фабрике.

encryption_key автоматически вызывается гемом attr_encrypted при назначении user_pass дляCredential объект.В этом случае это делается фабрикой.

Я бы переместил логику в вашем методе encryption_key в класс для облегчения тестирования:

class Credential < ApplicationRecord
  validates :user_name, presence: true
  enum credential_type: { windows: 1, linux: 2 }

  attr_encrypted :user_pass, key: :encryption_key

  def encryption_key
    EncryptionKeyGenerator.generate # or whatever name makes more sense
  end
end

Затем в моем тесте я бызаглушка EncryptionKeyGenerator:

RSpec.describe Credential, type: :model do
  let(:credential) { create(:credential) }
  let(:encryption_key) { "abcdefghijklmnopqrstuvw123456789" }

  before do
    allow(EncryptionKeyGenerator).to receive(:generate).and_return(encryption_key)
  end

  ...
end

Инкапсуляция вашей логики генерации ключа шифрования в отдельный объект отделяет ее от вашей модели, позволяя вам легко протестировать эту логику без необходимости создания Credential объекта.

...