Rspe c до проблем с проверкой - PullRequest
0 голосов
/ 08 июля 2020

Я пытаюсь написать несколько тестов для проверки перед проверкой модели в rspe c

class MyClass < ApplicationRecord
    before_validation :generate_anonymous_id
  
    def generate_anonymous_id
      retries ||= 1
      self.uuid = SecureRandom.uuid
      self.aid = Digest::SHA256.hexdigest(uuid)[0...15]
      raise ActiveRecord::RecordNotUnique if OtherClass.find_by_sfid(aid) ||
                                             MyClass.find_by_aid(aid)
    rescue ActiveRecord::RecordNotUnique => error
      Rails.logger.warn("Encountered duplicate uuid/aid")
      retries += 1
      retry if retries <= 3
      Rails.logger.warn("Raising exception after 3 retries")
      raise error
    end
end

вот мой rspe c

# frozen_string_literal: true

require "rails_helper"

RSpec.describe MyClass, type: :model do
  describe "model validation" do
    let(:my_class) do
      MyClass.create
    end

    context "valid" do
      it "allows to create a user aid" do
        expect(MyClass.new.valid?).to be_truthy 
      end
    end

    context "duplicate" do
      subject do
        MyClass.new
      end

      it "allows to create a user aid" do
        subject.uuid = my_class.aid
        expect(subject.valid?).to be_falsey
      end
    end
  end
end

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

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 08 июля 2020

Ваш before_validation перезаписывает subject.uuid, что происходит, когда вы вызываете subject.valid?, т.е. generate_anonymous_id заставляет его быть действительным

0 голосов
/ 13 июля 2020

Я вставил код, который вызывает исключение, и он сработал.

context "invalid record" do
  context "capture exception" do
    let!(:user) { create(:custom_user) } 
    before { allow(UserUuid).to receive(:find_by_sfid).and_return(true)}
    subject { described_class.new}
    
    it "raises exception" do
      expect { subject.valid? }.to raise_error(ActiveRecord::RecordNotUnique)
    end
  end
end
...