Rails: тестирование именованных областей с помощью RSpec - PullRequest
29 голосов
/ 26 июня 2011

Я новичок в тестировании веб-приложений Rails и RSpec. Я работаю с устаревшим кодом и мне нужно добавить тесты. Итак, каков наилучший способ тестирования искателей и именованных областей с помощью RSpec?

Я нахожу в Google несколько подходов, но они не идеальны. Например:

http://paulsturgess.co.uk/articles/show/93-using-rspec-to-test-a-named_scope-in-ruby-on-rails

it "excludes users that are not active" do
    @user = Factory(:user, :active => false)
    User.active.should_not include(@user)
end

или

http://h1labs.com/notebook/2008/8/21/testing-named-scope-with-rspec

it "should have a published named scope that returns ..." do
  Post.published.proxy_options.should == {:conditions => {:published => true}}
end

Я считаю наилучший подход (IMHO) в «Предписаниях по испытанию рельсов»:

should_match_find_method :active_only { :active == true }

где should_match_find_method пользовательский вспомогательный метод

Ответы [ 3 ]

32 голосов
/ 01 мая 2012

Создатель RSpec недавно написал в блоге, что он думает Проверки - это поведение, ассоциации - это структура .Другими словами, он считает, что ассоциации (и области) не должны обязательно проверяться напрямую.Тесты для них будут следовать из поведения, которое вы хотите.

Другими словами, в настоящее время мудрость заключается в том, что нет необходимости тестировать каждую область напрямую, поскольку вы будете охватывать эти ассоциации, тестируя поведение вашего приложения.

4 голосов
/ 14 марта 2018

С https://coderwall.com/p/hc8ofa/testing-rails-model-default_scope-with-rspec

  • нет запросов к базе данных
  • нет необходимости представлять запрос в структуре

Пример:

class Trip < ActiveRecord::Base
  default_scope { order(departure: :asc) }
  ...
end

RSpec.describe Trip, type: :model do
  it "applies a default scope to collections by departure ascending" do
    expect(Trip.all.to_sql).to eq Trip.all.order(departure: :asc).to_sql
  end
end
0 голосов
/ 26 июня 2011

Проблема с первым подходом заключается в том, что он фактически запрашивает базу данных. Это медленно и ненужно. Если вы не возражаете, вы можете смело использовать первый подход. Второй подход быстрый и понятный, поэтому я бы порекомендовал его.

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