Rubyists, в частности 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, but Post does not :belong_to :blog!
.Нужно подумать об ассоциациях, связанных с именами таблиц, внешними ключами и т. Д., А также обдумать: через модели на подходе.Я знаю, что надлежащие модульные тесты все равно обнаружат эти проблемы, но, как правило, как побочные эффекты других тестов.
Кто-нибудь знает проект, который это делает?(Меня интересует только ActiveRecord> = 3.1).Все, что я мог найти, было active_record_lint , которое на самом деле не делает этого вообще.
Кроме того, было бы здорово, если бы все существующие приборы могли быть проверены автоматически, чтобы убедиться, что онинадоедливые ассоциации.Я обычно просто делаю
test "fixtures" do
Post.all.each { |p| assert p.valid? "Fixture is broken! #{p.inspect}" }
end
, но, безусловно, есть более элегантный способ.