Модельное тестирование с помощью rspec - PullRequest
5 голосов
/ 24 декабря 2010

У меня есть кусок кода, который я хочу проверить:

class User < ActiveRecord::Base

 has_many :servers, :dependent=> :destroy

end

Пожалуйста, приведите пример кода RSpec, который проверяет код ассоциации.

Ответы [ 6 ]

8 голосов
/ 15 июня 2012

Для меня этот вариант хорошо работает:

describe User do
  it { should have_many(:servers).dependent(:destroy) }
end
4 голосов
/ 06 декабря 2011

Хотя ответ на ваш текущий вопрос может помочь вам прямо сейчас, вам действительно нужно понять Тестирование.

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

Я рекомендую вам купить книгу RSpec от прагматичных программистов. Он очень четко объяснит вам, что вы должны делать и как. Действительно хорошая книга, стоит каждой копейки.

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

Другой ответ использует Фабрику. Хотя это хорошая практика, я бы рекомендовал сначала использовать встроенные инструменты RSpec, такие как объекты Mock и методы-заглушки. Как только вы поймете, как работают эти два, вы можете использовать абстракцию, такую ​​как Фабрики. Кстати, изготовление проще.

1 голос
/ 01 марта 2013

Я представляю два подхода: быстрый и грязный, и СУХОЙ и чистый:)

Быстрый и грязный:

context "when testing dependent: destroy" do
  before do
    @user = User.create
    @servers = [Server.create]
    @user.servers = @servers
  end 

  it "should destroy all of the associated servers" do
    @servers.each{|s| Server.exists?(s.id).should be_false}
  end
end

Чтобы сделать это СУХИМ и многоразовым способом,только с зависимостью от самого rspec, вам нужен пользовательский сопоставитель для HasMany.Спецификация высокого уровня будет выглядеть следующим образом:

Subject { User.new }
it { should have_many :tasks, dependent: :destroy }

Тогда сопоставитель будет выглядеть следующим образом:

RSpec::Matchers.define :have_many do |_association, opts|
  if opts and opts[:dependent]

    match do |model|
      associations(model, :has_many, opts).any? { |a| a == _association }
    end

    failure_message_for_should do |model|
      error(
        :expected => [ "%s to have many %s and to have dependent => :destroy %s", model, _association, opts[:dependent] ],
        :actual   => [ "%s has many %s ", model, associations(model, :has_many) ]
      )
    end

  else

    match do |model|
      associations(model, :has_many).any? { |a| a == _association }
    end

    failure_message_for_should do |model|
      error(
        :expected => [ "%s to have many %s", model, _association ],
        :actual   => [ "%s has many %s", model, associations(model, :has_many) ]
      )
    end

  end
end

Вам понадобится этот вспомогательный модуль rspec: http://pastie.org/6356719

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

1 голос
/ 06 декабря 2011

Здесь я использую Factory girl:

it "should be destroyed when user is destroyed" do
  @user.servers << @server
  @user.destroy
  Server.all.should_not include(@server)
end

Но вы также можете создать нового пользователя в тесте следующим образом:

it "should be destroyed when user is destroyed" do
  user = User.create(:name => "Julia")
  user.servers << Server.create(:server_name => "Julias server")
  user.destroy
  Server.all.should_not include("Julias server")
end
0 голосов
/ 28 мая 2015

Для простых примеров спецификаций / поколений я бы порекомендовал использовать регрессор гемов:

https://github.com/ndea/regressor

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

0 голосов
/ 24 декабря 2010

Одним из способов тестирования ассоциаций в RSpec является использование shoulda .Следует, это набор помощников, которые делают общие повторяющиеся тесты быстрыми для написания, будучи понятнымиЧтобы проверить свою модель, убедитесь, что камень musta установлен и необходим.Затем вы можете проверить свою связь с чем-то вроде следующего:

describe User do
  it {should have_many :servers, :dependent => :destroy}
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...