Подтвердить что ты не робот

Rails RSpec Тесты для has_many: через отношения

Я новичок в тестировании и рельсах, но я пытаюсь правильно обработать TDD-процесс.

Мне было интересно, используете ли вы какую-либо парадигму для тестирования has_many: через отношения? (или просто has_many вообще, я полагаю).

Например, я нахожу, что в моих спецификациях модели я определенно пишу простые тесты, чтобы проверить оба конца отношений для связывания методов.

т

require 'spec_helper'

describe Post do

  before(:each) do
    @attr = { :subject => "f00 Post Subject", :content => "8ar Post Body Content" }
  end

  describe "validations" do
  ...    
  end

  describe "categorized posts" do

    before(:each) do
      @post  = Post.create!(@attr)
    end

    it "should have a categories method" do
      @post.should respond_to(:categories)
    end

  end

end

Затем в моих категориях spec я делаю обратный тест и проверяю для @category.posts

Что еще мне не хватает? спасибо!!

4b9b3361

Ответ 1

Я бы рекомендовал проверить драгоценный камень под названием Shoulda. В нем много макросов для тестирования таких вещей, как отношения и проверки.

Если вы хотите проверить, существует ли отношение has_many, вы можете сделать следующее:

describe Post do
  it { should have_many(:categories) }
end

Или, если вы тестируете has_many: through, вы должны использовать это:

describe Post do
  it { should have_many(:categories).through(:other_model) }
end

Я нахожу, что страница Shoulda Rdoc очень полезна.

Ответ 2

describe "when Book.new is called" do
  before(:each) do
    @book = Book.new
  end

  #otm
  it "should be ok with an associated publisher" do
    @book.publisher = Publisher.new
    @book.should have(:no).errors_on(:publisher)
  end

  it "should have an associated publisher" do
    @book.should have_at_least(1).error_on(:publisher)
  end

  #mtm
  it "should be ok with at least one associated author" do
    @book.authors.build
    @book.should have(:no).errors_on(:authors)
  end

  it "should have at least one associated author" do
    @book.should have_at_least(1).error_on(:authors)
  end

end

Ответ 3

remarkable будет делать это красиво:

describe Pricing do

  should_have_many :accounts, :through => :account_pricings
  should_have_many :account_pricings
  should_have_many :job_profiles, :through => :job_profile_pricings
  should_have_many :job_profile_pricings

end

Как правило, вы просто копируете все свои отношения из модели в спецификацию и меняете "есть" на "should_have", "belongs_to" на "should_belong_to" и т.д. Чтобы ответить на обвинение в том, что он тестирует рельсы, он также проверяет базу данных, следя за тем, чтобы ассоциация работала.

Макросы также включены для проверки валидации:

should_validate_numericality_of :amount, :greater_than_or_equal_to => 0