bro*_*son 7 rspec rspec-rails rails-activerecord ruby-on-rails-5
我还没有找到测试ApplicationRecord方法的好方法。
假设我有一个简单的方法,名为one:
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
def one
1
end
end
Run Code Online (Sandbox Code Playgroud)
我想测试一下:
describe ApplicationRecord do
let(:it) { described_class.new }
it 'works' do
expect(it.one).to eq 1
end
end
Run Code Online (Sandbox Code Playgroud)
这毫不奇怪地死于 NotImplementedError: ApplicationRecord is an abstract class and cannot be instantiated.
let(:it) { Class.new(described_class).new }
Run Code Online (Sandbox Code Playgroud)
并且此操作死于TypeError: no implicit conversion of nil into String,大概是因为记录的表名是nil。
谁能建议一种很好的简单方法来测试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
Run Code Online (Sandbox Code Playgroud)
它只是防止类尝试数据库连接来加载表模式。
显然,作为沿导轨移动,你可能需要更新你做到这一点,但至少它坐落在一个容易找到的地方的方式。
我比拥有另一个允许测试的模块更喜欢这一点。
我建议将这些方法提取到模块(有关)中,并不要理会ApplicationRecord。
module SomeCommonModelMethods
extend ActiveSupport::Concern
def one
1
end
end
class ApplicationRecord < ActiveRecord::Base
include SomeCommonModelMethods
self.abstract_class = true
end
describe SomeCommonModelMethods do
let(:it) { Class.new { include SomeCommonModelMethods }.new } }
it 'works' do
expect(it.one).to eq 1
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1606 次 |
| 最近记录: |