gpt4 book ai didi

ruby-on-rails - 测试使用 ActiveRecord 的关注点/模块

转载 作者:数据小太阳 更新时间:2023-10-29 06:39:37 26 4
gpt4 key购买 nike

场景我提取了一个名为 Taggable关注点。它是一个允许任何模型支持标记的模块。我已将此关注点/模块包含到模型中,例如 UserLocationPlacesProjects

我想为这个模块编写测试,但不知道从哪里开始。

问题
<强>1。我可以对 Taggable 问题进行隔离测试吗?
在下面的示例中,测试失败是因为测试正在查找 dummy_class 表。我假设它这样做是因为 Taggable 中的 has_many 代码,因此它期望 'DummyClass' 是一个 ActiveRecord 对象。

# /app/models/concerns/taggable.rb
module Taggable
extend ActiveSupport::Concern

included do
has_many :taggings, :as => :taggable, :dependent=> :destroy
has_many :tags, :through => :taggings
end

def tag(name)
name.strip!
tag = Tag.find_or_create_by_name(name)
self.taggings.find_or_create_by_tag_id(tag.id)
end
end


# /test/models/concerns/taggable_test.rb
require 'test_helpers'

class DummyClass
end

describe Taggable do
before do
@dummy = DummyClass.new
@dummy.extend(Taggable)
end

it "gets all tags" do
@dummy.tag("dummy tag")
@dummy.tags.must_be_instance_of Array
end
end

我的一部分认为,如果我只是测试一个包含此模块的模型(如 User),那么测试就足够了。但我一直在读到你应该单独测试模块。

寻找关于什么是正确方法的指导/策略。

最佳答案

我建议让 DummyClass 成为一个通用的 ActiveRecord::Base 子级,除了 include Taggable 之外几乎没有自定义代码,这样你将尽可能地隔离您关注的模块,但仍然是一个 AR 类。避免使用诸如 User 之类的“真实”类之一仍然会将您与这些类中的任何其他代码隔离开来,这似乎很有值(value)。

所以像这样:

class DummyClass < ActiveRecord::Base; end

describe Taggable do
before do
@dummy_class = DummyClass.new
end
...
end

由于您的 DummyClass 可能需要实际与数据库交互以测试诸如关联之类的东西,因此您可能需要在测试期间在数据库中创建临时表。 temping Ruby gem 可能会对此有所帮助,因为它旨在创建临时 ActiveRecord 模型及其底层数据库表。

Temping allows you to create arbitrary ActiveRecord models backed by a temporary SQL table for use in tests. You may need to do something like this if you're testing a module that is meant to be mixed into ActiveReord models without relaying on a concrete class.

关于ruby-on-rails - 测试使用 ActiveRecord 的关注点/模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15868210/

26 4 0
文章推荐: ruby - Ruby 的稀疏矩阵库
文章推荐: ruby-on-rails - salt 如何在 Rails 的 has_secure_password 中工作
文章推荐: android - 如何删除顶部和底部 ListTile 抖动的空间?
文章推荐: dart - 如何将我的 List 显示到 Listview 中?