Проблема с тестом rspec с полиморфным классом - PullRequest
0 голосов
/ 08 июня 2011

Я использую MongoMapper вместо ActiveRecord.

У меня есть модель пользователя и модель задачи.В модели задач у меня есть 2 атрибута:

  • Владелец
  • Автор

Оба атрибута являются ссылками пользователя.

Вот отношения между двумя моделями:

User.rb

has_many :tasks, :as => :owner

Taks.rb

belongs_to :owner, :class_name => "User", :polymorphic => true

Я использовал RSpec для написания теста: (@пользователь объявлен ранее)

it "should have many tasks" do
    another_user = Factory.create(:user, :email => Faker::Internet.email)

    task_1 = Factory.create(:task, :owner => another_user, :author => another_user)
    task_2 = Factory.create(:task, :owner => another_user, :author => @user)
    task_3 = Factory.create(:task, :owner => @user, :author => @user)

    another_user.tasks.size.should == 2
end

И вот в чем проблема:

Failure/Error: another_user.tasks.size.should == 2
expected: 2
got: 3 (using ==)

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

Вот заводы:

Factory.define :user do |u|
  u.first_name 'Test User'                          #
  u.username 'Test User'                            #
  u.surname 'TheTest'                               #
  u.email 'foo@foobar.com'                          #
  u.password 'please'                               #
  u.confirmed_at Time.now                           #
end

Factory.define :task do |u|
  u.author nil                                      #
  u.owner nil                                       #
  u.subjects []
  u.timeframe ""
  u.initially_placed_at nil
  u.label "Foo Task"                                #
  u.description "A small task description"
  u.done false
  u.pinned false
  u.confidentiality ""
end

Ответы [ 2 ]

0 голосов
/ 08 июня 2011

Это действительно ошеломляет. Я вижу несколько вариантов, которые помогут вам найти это:

  • используйте Rubymine, где вы можете легко отлаживать свои тесты

  • добавить много лог-операторов

  • добавить следующий тест:

    another_user.tasks.should = ~ [task1, task2]

Это покажет разницу в списке предметов, а другой предмет будет task3?

  • Надеюсь, ваша фабрика не создает задачу по умолчанию для каждого пользователя?

Кроме этого: действительно, оформить заказ musta !

0 голосов
/ 08 июня 2011

Существует несколько ответов на этот вопрос:

1) Возможно, у вас есть утечка спецификации, которая запускается до этой спецификации (это означает, что задача создается с идентификатором и типом 'another_user' до этой

2) Возможно, также потребуется создать задачи (попробуйте использовать Factory.create (: task) вместо только Factory (: task)

3) Возможно, вы захотите проверить shoulda , это очень легко помогает вам связать спецификации, например, вот так:

it {should have_many (: posts)}

...