Rails RSpec тесты для has_many: через отношения - PullRequest
23 голосов
/ 20 октября 2010

Я новичок в тестировании и рельсах, но я пытаюсь правильно запустить процесс 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

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

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

Ответы [ 3 ]

56 голосов
/ 20 октября 2010

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

Если все, что вам нужно, это проверить, что существует отношение 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

Мне также очень полезна страница Ifa Rdoc .

2 голосов
/ 06 июля 2011
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
1 голос
/ 20 октября 2010

замечательный сделает это красиво:

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

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

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

should_validate_numericality_of :amount, :greater_than_or_equal_to => 0
...