gpt4 book ai didi

ruby-on-rails - ActiveRecord 有 Lint 吗?

转载 作者:太空宇宙 更新时间:2023-11-03 16:56:11 25 4
gpt4 key购买 nike

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/

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