gpt4 book ai didi

rspec - 如何测试 ApplicationRecord 抽象基类中的方法?

转载 作者:行者123 更新时间:2023-12-04 10:36:03 27 4
gpt4 key购买 nike

我还没有找到测试 ApplicationRecord 方法的好方法。

假设我有一个名为 one 的简单方法:

class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true

def one
1
end
end

我想测试它:
describe ApplicationRecord do
let(:it) { described_class.new }

it 'works' do
expect(it.one).to eq 1
end
end

不出所料,这会随着 NotImplementedError: ApplicationRecord is an abstract class and cannot be instantiated. 而死。

所以我尝试了 Testing abstract classes in Rspec中的匿名类(class)建议:
let(:it) { Class.new(described_class).new }

这会随着 TypeError: no implicit conversion of nil into String 而死,大概是因为记录的表名是零。

任何人都可以建议一个测试 ApplicationRecord 方法的好方法吗?希望它不会在我的应用程序中引入对其他类的依赖关系并且不会根植于 ActiveRecord 内部?

最佳答案

这在我们的测试中一直对我有用:

class TestClass < ApplicationRecord
def self.load_schema!
@columns_hash = {}
end
end

describe ApplicationRecord do
let(:record) { TestClass.new }

describe "#saved_new_record?" do
subject { record.saved_new_record? }

before { allow(record).to receive(:saved_change_to_id?).and_return(id_changed) }

context "saved_change_to_id? = true" do
let(:id_changed) { true }

it { is_expected.to be true }
end

context "saved_change_to_id? = false" do
let(:id_changed) { false }

it { is_expected.to be false }
end
end
end

它只是阻止类尝试数据库连接来加载表模式。

显然,随着 Rails 的发展,您可能需要更新执行此操作的方式,但至少它位于一个容易找到的位置。

我更喜欢这个,而不是仅仅为了允许测试而拥有另一个模块。

关于rspec - 如何测试 ApplicationRecord 抽象基类中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35373590/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com