【问题标题】:Rspec before validation issues验证问题之前的 Rspec
【发布时间】:2020-07-08 18:26:09
【问题描述】:

我正在尝试编写一些测试以在 rspec 中验证模型之前进行检查

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

这是我的 rspec

# 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

我正在尝试测试救援块,但我的测试总是通过。我无法覆盖我的主题,我不知道我在做什么。

提前致谢

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-5 rspec3


    【解决方案1】:

    您的before_validation 会覆盖subject.uuid,当您调用subject.valid? 时会发生这种情况,即generate_anonymous_id 会强制它有效

    【讨论】:

    • 在这种情况下我如何测试救援块。保存主题也会调用验证和覆盖。不是@JuJoDi
    【解决方案2】:

    我对引发异常的代码进行了存根处理。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 2021-10-29
      • 2011-01-25
      • 1970-01-01
      相关资源
      最近更新 更多