2012-07-11 110 views
0

我是RoR的一名完整newby,我正在通过Hartl rails教程(http://ruby.railstutorial.org/)工作。我被困在为第10.1.4测试我不断收到以下错误:Rspec测试未通过Michael Hartl的教程部分10.1.4

失败:

1)用户协会微柱破坏应该相关的微柱 故障/错误:FactoryGirl.create(:微柱,用户:@user,created_at:1.day.ago) NoMethodError: 未定义的方法content=' for #<User:0x007fce7c86b1e8> # ./spec/models/user_spec.rb:147:in块(3级)在'

2)用户关联微柱应该具有以正确的次序 故障/错误的权利微柱: FactoryGirl.create(:micropost,user:@user,created_at:1.day.ago) NoMethodError: 未定义的方法content=' for #<User:0x007fce7cbd6288> # ./spec/models/user_spec.rb:147:in块(3级)在'

由于我这样的新手我的调试能力是相当有限的。我敢肯定这是不是一个巨大的问题,所以我希望得到任何帮助,我可以得到的,这里是我的代码:

USER_SPEC.RB

require 'spec_helper' 

    describe User do 

     # Before means this code will run before every test is performed 
     before do 
     @user = User.new(name: "Example User", email: "[email protected]", 
         password: "foobar", password_confirmation: "foobar") 
     end 

     subject { @user } 

     it { should respond_to(:admin) } 
     it { should respond_to(:authenticate) } 
     it { should respond_to(:name) } 
     it { should respond_to(:email) } 
     it { should respond_to(:password_digest) } 
     it { should respond_to(:password) } 
     it { should respond_to(:password_confirmation) } 
     it { should respond_to(:microposts) } 

     it { should be_valid } 
     it { should_not be_admin } 

     . 
     . 
     . 
     . 

     describe "micropost associations" do 

     before { @user.save } 
     let!(:older_micropost) do 
      FactoryGirl.create(:micropost, user: @user, created_at: 1.day.ago) 
     end 
     let!(:newer_micropost) do 
      FactoryGirl.create(:micropost, user: @user, created_at: 1.hour.ago) 
     end 

     it "should destroy associated microposts" do 
      microposts = @user.microposts 
      @user.destroy 
      microposts.each do |micropost| 
      Micropost.find_by_id(micropost.id).should be_nil 
      end 
     end 

     it "should have the right microposts in the right order" do 
      @user.microposts.should == [newer_micropost, older_micropost] 
     end 
     end 
    end 

USER.RB

class User < ActiveRecord::Base 
     attr_accessible :name, :email, :password, :password_confirmation 
     has_secure_password 
     has_many :microposts, dependent: :destroy 

     before_save { self.email.downcase! } 
     before_save :create_remember_token 

     validates :name, presence: true, length: { maximum: 50 } 

     VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
     validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, 
       uniqueness: { case_sensitive: false } 

     validates :password, presence: true, length: { minimum: 6 } 
     validates :password_confirmation, presence: true 

     private 

     def create_remember_token 
      self.remember_token = SecureRandom.urlsafe_base64 
     end 

    end 

MICROPOST_SPEC.RB

require 'spec_helper' 

    describe Micropost do 

     let(:user) { FactoryGirl.create(:user) } 
     before { @micropost = user.microposts.build(content: "Lorem ipsum") } 

     subject { @micropost } 

     it { should respond_to(:content) } 
     it { should respond_to(:user_id) } 
     it { should respond_to(:user) } 
     its(:user) { should == user } 

     it { should be_valid } 

     describe "when user_id is not present" do 
     before { @micropost.user_id = nil } 
     it { should_not be_valid } 
     end 

     describe "accessible attributes" do 
     it "should not allow access to user_id" do 
      expect do 
      Micropost.new(user_id: user.id) 
      end.should raise_error(ActiveModel::MassAssignmentSecurity::Error) 
     end  
     end 
    end 

MICROPOST.RB

class Micropost < ActiveRecord::Base 
     attr_accessible :content 
     belongs_to :user 

     validates :user_id, presence: true 
     default_scope order: 'microposts.created_at DESC' 
    end 

FACTORIES.RB

FactoryGirl.define do 
     factory :user do 
     sequence(:name) { |n| "Person #{n}" } 
     sequence(:email) { |n| "person_#{n}@example.com"} 
     password "foobar" 
     password_confirmation "foobar" 

     factory :admin do 
      admin true 
     end 
     end 

     factory :micropost do 
     content "Lorem ipsum" 
     user 
     end 
    end 

,最后我的Gemfile:

source 'https://rubygems.org' 

    gem 'rails', '3.2.5' 
    gem 'jquery-rails', '2.0.0' 
    gem 'bootstrap-sass', '2.0.0' 
    gem 'bcrypt-ruby', '3.0.1' 
    gem 'faker', '1.0.1' 
    gem 'will_paginate', '3.0.3' 
    gem 'bootstrap-will_paginate', '0.0.6' 
    gem 'hirb' 

    group :development, :test do 
     gem 'sqlite3', '1.3.5' 
     gem 'rspec-rails', '2.10.0' 
     gem 'guard-rspec', '0.5.5' 
    end 

    # Gems used only for assets and not required 
    # in production environments by default. 
    group :assets do 
     gem 'sass-rails', '3.2.4' 
     gem 'coffee-rails', '3.2.2' 
     gem 'uglifier', '1.2.3' 
    end 

    group :test do 
     gem 'capybara', '1.1.2' 
     gem 'factory_girl_rails', '1.4.0' 
     gem 'cucumber-rails', '1.2.1', :require => false 
     gem 'database_cleaner', '0.7.0' 
     gem 'guard-spork', '0.3.2' 
     gem 'spork', '0.9.0' 
     gem 'launchy', '2.1.0' 
     gem 'rb-fsevent', '0.9.1', :require => false 
     gem 'growl', '1.0.3' 
    end 

    group :production do 
     gem 'pg', '0.12.2' 
    end 

谢谢你的任何帮助,我在这一个得到。

+0

你的代码似乎是好的,但因为你加入在[10.1.4节](http://ruby.railstutorial.org/book/ruby-on-rails-tutorial#sec:ordering_and_dependency)中**:spec/factories.rb **的':micropost'工厂,你可能需要重新启动服务器(或者'spork',因为我假设您正在使用它),以便反映这些更改。 – 2012-07-11 14:59:08

+0

非常感谢Paul。你是对的。重新启动服务器正是我所需要的。我正在使用警卫spork。我尝试重新启动guard-spork,但那不起作用,然后一旦我阅读了你的建议,我重新启动了服务器,现在所有的测试都通过了。 – felipeab 2012-07-11 23:00:44

+0

太棒了!我会把它作为答案来解决这个问题。 – 2012-07-11 23:18:32

回答

3

既然你在section 10.1.4添加:micropost工厂规格/ factories.rb,你加入这个文件会进行一次重新启动叉勺体现。

+0

这一切都工作后,我重新启动服务器 – felipeab 2012-07-24 14:02:18

+0

好吧,现在只需点击打勾来接受这个答案。 – 2012-07-24 14:33:32

0

好像在你USER_SPEC.RB你缺少

it { should respond_to(:remember_token) } 

我的是这样,它的工作原理,通过测试

subject { @user } 
it { should respond_to(:admin) } 
it { should respond_to(:authenticate) } 
it { should respond_to(:name) } 
it { should respond_to(:email) } 
it { should respond_to(:password_digest) } 
it { should respond_to(:password) } 
it { should respond_to(:password_confirmation) } 
it { should respond_to(:remember_token) } 
it { should respond_to(:microposts) } 
相关问题