如何在ApplicationRecord抽象基类中测试方法?

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.

所以我在Rspec中的测试抽象类中尝试了匿名类建议:

let(:it) { Class.new(described_class).new }
Run Code Online (Sandbox Code Playgroud)

并且此操作死于TypeError: no implicit conversion of nil into String,大概是因为记录的表名是nil。

谁能建议一种很好的简单方法来测试ApplicationRecord方法?希望它不会在我的应用程序中引入对其他类的依赖关系,并且不会扎根于ActiveRecord内部吗?

ozz*_*ron 6

在我们的测试中,这一直为我工作:

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)

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

显然,作为沿导轨移动,你可能需要更新你做到这一点,但至少它坐落在一个容易找到的地方的方式。

我比拥有另一个允许测试的模块更喜欢这一点。


Ole*_*yan 5

我建议将这些方法提取到模块(有关)中,并不要理会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)

  • 为单行函数创建一个关注文件?感觉就像是在扭曲我的应用程序的源代码以弥补语言/库的限制。我仍然希望有人可以建议如何测试 ApplicationRecord 类本身,但感谢您写得很好的建议! (2认同)