ruby-on-rails - ActiveRecord 有 Lint 吗?

标签 ruby-on-rails ruby unit-testing testing activerecord

Ruby 爱好者,尤其是 Railsers,对 ActiveModel::Lint 了如指掌。 ,这是确保您在编写 ActiveModel 子类时不会出错的便捷方法,并且可以节省数小时的挠头时间。我一直将它用于 Rails 项目中的无表模型。

但我花了很多时间来查找我使用 ActiveRecord 时出现的错误 - 特别是在双边关联方面。例如

# app/models/blog.rb
class Blog < ActiveRecord::Base
  has_many :posts # so far so good...
end

# app/models/post.rb
class Post < ActiveRecord::Base
  has_one :blog # incorrect - should be belongs_to
end

这个例子有点做作,因为没有人那样傻。但是,如果 Blog 实际上有一个 post_id 列呢?不会在预期的地方出现异常。

我希望能够像这样为 Blog 编写测试

# test/unit/blog_test.rb
require 'test/test_helper'
class BlogTest < ActiveSupport::TestCase
  include ActiveRecord::Lint
end

...并且测试输出应该像 Blog :has_many :posts,但 Post 不 :belong_to :blog!。它需要反射(reflection)关联,处理表名、外键等,并在途中考虑 :through 模型。我知道适当的单元测试无论如何都会检测到这些问题,但通常是其他测试的副作用。

有谁知道这样做的项目吗? (我只对 ActiveRecord >= 3.1 感兴趣)。我能找到的只有 active_record_lint ,实际上根本不这样做。

此外,如果所有现有的固定装置都可以自动测试,以确保设置那些讨厌的关联,那就太好了。我通常只是做

test "fixtures" do
  Post.all.each { |p| assert p.valid? "Fixture is broken! #{p.inspect}" }
end

但肯定有更优雅的方式。

最佳答案

像这样的工具会很有用,但无论如何您都应该明确地测试这些东西。这将立即发现此类问题。例如,一个典型的单元测试:

def test_defaults
  blog = Blog.create(
    :title => 'Example Blog'
  )

  assert blog.valid?
  assert_equal [ ], blog.errors.full_messages
  assert !blog.new_record?

  assert_equal 0, blog.posts.count
end

对于您的帖子:

def test_defaults
  blog = Blog.create(
    :title => 'Example Blog'
  )

  post = Post.create(
    :blog => blog,
    :content => 'Blogging blog bloggers blogged blogs'
  )

  assert post.valid?
  assert_equal [ ], post.errors.full_messages
  assert !post.new_record?

  assert_equal blog.id, post.blog_id
  assert_equal 1, blog.posts.count
end

那些是一些 helper methods 的长格式版本我通常使用的。

如果您不运用这些关系,那么您就没有在测试它们,您的测试覆盖率就会出现问题。如果你的关系不好,它会显示为错误。

关于ruby-on-rails - ActiveRecord 有 Lint 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9004372/

相关文章:

c++ - 在测试中,有没有办法防御来自未定义行为的 "correct"结果?

ruby-on-rails - Rails elasticsearch - 命名范围搜索

ruby-on-rails - RoR 中 <% %> 和 <%= %> 之间的差异

mysql - Rails 数据库查询中的语法错误

ruby - 绕过 Ruby 1. 9's new " native “线程”

javascript - Enzyme/Jest 静态方法模拟未运行

ruby-on-rails - PG::UndefinedFunction: 错误:运算符不存在:文本 = bool 值

ruby - 如何使用 redis-rb gem 基于 wildchar redis key 获取集合?

ruby-on-rails - 如何将默认选择的“选择一个字段”选项添加到我的 Rails 下拉列表中?

angularjs - 如何在模块配置中模拟提供程序/配置以进行单元测试