使用多态类进行rspec测试时出现问题

时间:2011-06-08 07:57:44

标签: ruby-on-rails rspec rspec2 polymorphic-associations

我正在使用MongoMapper而不是ActiveRecord。

我有一个用户模型和一个任务模型。 在任务模型中,我有两个属性如下:

  • 所有者
  • 作者

这两个属性都是用户引用。

以下是两种模型之间的关系:

User.rb

has_many :tasks, :as => :owner

Taks.rb

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

我使用RSpec编写测试: (@user之前声明)

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 :(得分:0)

有几个答案:

1)您可能有一个在此规范之前运行的泄漏规范(这意味着在此之前使用id和类型'another_user'创建任务

2)也许有必要创建任务(尝试使用Factory.create(:task)而不仅仅是Factory(:task)

3)您可能想查看shoulda,它可以帮助您轻松地指定关联,例如:

它{should have_many(:posts)}

答案 1 :(得分:0)

这确实令人头疼。我看到一些选项可以帮助您找到这个:

  • 使用Rubymine,您可以轻松调试测试

  • 添加了很多日志语句

  • 添加以下测试:

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

这会显示商品列表中的差异,而其他商品会显示为task3吗?

  • 我希望您的工厂不为每个用户创建默认任务?

除此之外:确实,结帐shoulda

相关问题