3

我一直在关注 Rails 教程(http://railstutorial.org/chapters/beginning,Rails 3 版本),当使用 Factory Girl 和 Rspec 时,我已经停在第 11 章,我有一个没有通过的测试我觉得我做错了什么,但我不明白是什么。
首先,Github 上有一个 git 存储库,其中包含未通过该测试的代码。 http://github.com/Monomachus/ch3_static_pages

所以我得到了用户模型

class User < ActiveRecord::Base
  attr_accessor :password
  attr_accessible :name, :email, :password, :password_confirmation

  has_many :microposts
  .
  .
  .


我有微博模型

class Micropost < ActiveRecord::Base
  attr_accessible :content

  belongs_to :user

  default_scope :order => 'microposts.created_at DESC'
end

然后我得到了工厂女孩设置

Factory.define :user do |user|
  user.name                  "Michael Hartl"
  user.email                 "mhartl@example.com"
  user.password              "foobar"
  user.password_confirmation "foobar"
end

Factory.define :micropost do |micropost|
  micropost.content "Foo bar"
  micropost.association :user
end

最后是 Rspec 代码

require 'spec_helper'

describe Micropost do
    .
    . 
  describe "microposts associations" do

    before(:each) do
      @user = User.create(@attr)
      @mp1 = Factory(:micropost, :user => @user, :created_at => 1.day.ago)
      @mp2 = Factory(:micropost, :user => @user, :created_at => 1.hour.ago)
    end

    it "should have a microposts attribute" do
      @user.should respond_to(:microposts)
    end

    it "should be in the reverse order of appearing" do
      @user.microposts.should == [@mp2, @mp1]
    end
  end
end

我得到了一个错误,它肯定告诉我我做错了什么。

Failures:

  1) Micropost microposts associations should be in the reverse order of appearing
     Failure/Error: @user.microposts.should == [@mp2, @mp1]
     expected: [#<Micropost id: 2, content: "Foo bar", user_id: nil, created_at: "2010-12-24 12:47:02", update
d_at: "2010-12-24 13:47:02">, #<Micropost id: 1, content: "Foo bar", user_id: nil, created_at: "2010-12-23 13:
47:02", updated_at: "2010-12-24 13:47:02">],
          got: [] (using ==)
     Diff:
     @@ -1,3 +1,2 @@
     -[#<Micropost id: 2, content: "Foo bar", user_id: nil, created_at: "2010-12-24 12:47:02", updated_at: "20
10-12-24 13:47:02">,
     - #<Micropost id: 1, content: "Foo bar", user_id: nil, created_at: "2010-12-23 13:47:02", updated_at: "20
10-12-24 13:47:02">]
     +[]
     # ./spec/models/micropost_spec.rb:42:in `block (3 levels) in <top (required)>'

如您所见,即使 user_id 属性设置不正确+
显然@user.microposts 没有任何元素。
请帮我解决这个问题谢谢

4

3 回答 3

2

答案很简单:)我在 Micropost 规范中包含了 microposts 关联。

而且很明显

describe "microposts associations" do

  before(:each) do
    @user = User.create(@attr)
    @mp1 = Factory(:micropost, :user => @user, :created_at => 1.day.ago)
    @mp2 = Factory(:micropost, :user => @user, :created_at => 1.hour.ago)
  end

  it "should have a microposts attribute" do
    @user.should respond_to(:microposts)
  end

  it "should be in the reverse order of appearing" do
    @user.microposts.should == [@mp2, @mp1]
  end
end

@attr 不包含用户属性,但包含微帖子属性,当然还有@user = nil,然后一切都有意义。因此,如果您确实有同样的问题,请将此代码包含在用户规范中。现在我所有的测试都通过了:)

于 2010-12-24T14:54:44.210 回答
1

当我完成分页章节时,教程正在使用 Faker 创建 100 个示例用户(在第 390 页列出 10.25),在 RubyMine 中,我能够看到我的测试失败,因为程序在重复用户电子邮件上抛出异常地址(具有唯一约束)。user_spec.rb 第 8 行的 @attr 有 :email => "user@example.com",但是这会引发异常,因为它是重复的电子邮件(我猜是因为 Faker 已经创建了它)。

对我来说,解决方法是从第 8 行复制@attr 并将其粘贴到描述“micropost 关联”块(user_spec.rb)中,并将电子邮件地址更改为:email =>“user@example999.com”。我确定这是一个完全的黑客,但我是一个 n00b。

更新:

我的另一个解决方法是注释掉@user = User.create(@attr) 行,然后简单地创建@mp1 和@mp2。

于 2011-09-02T00:26:16.350 回答
0

尽管我在 user_spec.rb 中已经有了“微帖子关联”,但我在本节中也遇到了测试失败。结果我需要重新启动 spork 和 autotest 才能让他们使用 factory.rb 中新的“micropost”工厂。

于 2011-08-31T00:05:42.070 回答