Есть ли Lint для ActiveRecord? - PullRequest
       0

Есть ли Lint для ActiveRecord?

2 голосов
/ 25 января 2012

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

, но, безусловно, есть более элегантный способ.

1 Ответ

0 голосов
/ 25 января 2012

Такой инструмент был бы полезен, но вы все равно должны явно тестировать эти вещи. Это сразу же обнаружит подобные проблемы. Например, типовой юнит-тест:

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

Это длинные версии некоторых вспомогательных методов , которые я обычно использую.

Если вы не осуществляете отношения, вы не проверяете их, и у вас есть проблема с вашим тестовым покрытием. Если у вас плохие отношения, это будет выглядеть как ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...