2012-10-11 91 views
0

我是新來的rails,並且在完成Michael Hartl的Ruby on Rails教程之後,我試圖擴展一些功能。我通過改變微博開始,以便收集更多數據。Rails rspec錯誤:「預計有效?返回true,得到錯誤」

當運行RSpec的測試,我想不通爲什麼我收到此錯誤:

$ bundle exec rspec spec/models/micropost_spec.rb 
...............F..... 

Failures: 

    1) Micropost 
    Failure/Error: it { should be_valid } 
     expected valid? to return true, got false 
    # ./spec/models/micropost_spec.rb:46:in `block (2 levels) in <top (required)>' 

Finished in 1.57 seconds 
21 examples, 1 failure 

Failed examples: 

rspec ./spec/models/micropost_spec.rb:46 # Micropost 

micropost_spec.rb

require 'spec_helper' 

describe Micropost do 

    let(:user) { FactoryGirl.create(:user) } 
    before { @micropost = user.microposts.build(content: "Lorem ipsum", 
    title: "This is a test title", 
    privacy: "1", 
    groups: "This is a test Group", 
    loc1T: "21 Bond St. Toronto, Ontario", 
    loc1Lat: "43.654653", 
    loc1Lon: "-79.377627", 
    loc2T: "21 Bond St. Toronto, Ontario", 
    loc2Lat: "43.654653", 
    loc2Lon: "-79.377627", 
    startTime: "Jan 1, 2000 12:01:01", 
    endTime: "Jan 2, 2000 12:01:01", 
    imageURL: "http://i.cdn.turner.com/cnn/.e/img/3.0/global/header/hdr-main.gif") 

    puts @micropost.errors.messages 
    } 

    #before { @micropost = user.microposts.build(title: "This is a test title") } 
    #before { @micropost = user.microposts.build(privacy: "1") } 
    #before { @micropost = user.microposts.build(groups: "This is a test Group") } 
    #before { @micropost = user.microposts.build(loc1T: "21 Bond St. Toronto, Ontario") } 
    #before { @micropost = user.microposts.build(loc1Lat: "43.654653") } 
    #before { @micropost = user.microposts.build(loc1Lon: "-79.377627") } 
    #before { @micropost = user.microposts.build(loc2T: "21 Bond St. Toronto, Ontario") } 
    #before { @micropost = user.microposts.build(loc2Lat: "43.654653") } 
    #before { @micropost = user.microposts.build(loc2Lon: "-79.377627") } 
    #before { @micropost = user.microposts.build(startTime: "Jan 1, 2000 12:01:01") } 
    #before { @micropost = user.microposts.build(endTime: "Jan 2, 2000 12:01:01") } 
    #before { @micropost = user.microposts.build(imageURL: "http://i.cdn.turner.com/cnn/.e/img/3.0/global/header/hdr-main.gif") } 



    subject { @micropost } 

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

    it { should respond_to(:title) } 
    it { should respond_to(:privacy) } 
    it { should respond_to(:groups) } 
    it { should respond_to(:loc1T) } 
    it { should respond_to(:loc1Lat) } 
    it { should respond_to(:loc1Lon) } 
    it { should respond_to(:loc2T) } 
    it { should respond_to(:loc2Lat) } 
    it { should respond_to(:loc2Lon) } 
    it { should respond_to(:startTime) } 
    it { should respond_to(:endTime) } 
    it { should respond_to(:imageURL) } 



    its(:user) { should == user } 

    it { should be_valid } 

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

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

    describe "with blank content" do 
    before { @micropost.content = " " } 
    it { should_not be_valid } 
    end 

    describe "with content that is too long" do 
    before { @micropost.content = "a" * 141 } 
    it { should_not be_valid } 
    end 
end 

micropost.rb

class Micropost < ActiveRecord::Base 
    attr_accessible :content, :title,:privacy,:groups,:loc1T,:loc1Lat,:loc1Lon,:loc2T,:loc2Lat,:loc2Lon,:startTime,:endTime,:imageURL 



    belongs_to :user 

    validates :user_id, presence: true 
    validates :title, presence: true 
    validates :privacy, presence: true 
    validates :groups, presence: true 
    validates :loc1T, presence: true 
    validates :loc1Lat, presence: true 
    validates :loc1Lon, presence: true 
    validates :loc2T, presence: true 
    validates :loc2Lat, presence: true 
    validates :loc2Lon, presence: true 
    validates :startTime, presence: true 
    validates :endTime, presence: true 
    validates :imageURL, presence: true 

    validates :content, presence: true, length: { maximum: 140 } 

    default_scope order: 'microposts.created_at DESC' 

    def self.from_users_followed_by(user) 
    followed_user_ids = "SELECT followed_id FROM relationships 
         WHERE follower_id = :user_id" 
    where("user_id IN (#{followed_user_ids}) OR user_id = :user_id", 
      user_id: user.id) 
    end 
end 

factories.rb

FactoryGirl.define do 
    factory :user do 
    #name  "Michael Hartl" 
    #email "[email protected]" 
    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" 
    title "This is a test title" 
    privacy "1" 
    groups "This is a test Group" 
    loc1T "21 Bond St. Toronto, Ontario" 
    loc1Lat "43.654653" 
    loc1Lon "-79.377627" 
    loc2T "21 Bond St. Toronto, Ontario" 
    loc2Lat "43.654653" 
    loc2Lon "-79.377627" 
    startTime "Jan 1, 2000 12:01:01" 
    endTime "Jan 2, 2000 12:01:01" 
    imageURL "http://i.cdn.turner.com/cnn/.e/img/3.0/global/header/hdr-main.gif" 

    user 
    end 
end 

我不知道是否有其他任何你需要我張貼。

+0

可以把你的微柱價值,並檢查它的值。 –

+0

我該如何把micropost的價值和檢查它的價值? – Livi17

+0

在某些測試用例中使用puts語句,然後運行bundle exec rspec spec,它將打印您的微博,如.......... microspost:blah.F ...... –

回答

0

這擺脫了錯誤。

micropost_spec.rb

describe Micropost do 

    let(:user) { FactoryGirl.create(:user) } 
    before { @micropost = user.microposts.build(content: "Lorem ipsum", 
    title: "This is a test title", 
    privacy: "1", 
    groups: "This is a test Group", 
    loc1T: "21 Bond St. Toronto, Ontario", 
    loc1Lat: "43.654653", 
    loc1Lon: "-79.377627", 
    loc2T: "21 Bond St. Toronto, Ontario", 
    loc2Lat: "43.654653", 
    loc2Lon: "-79.377627", 
    startTime: "Jan 1, 2000 12:01:01", 
    endTime: "Jan 2, 2000 12:01:01", 
    imageURL: "http://i.cdn.turner.com/cnn/.e/img/3.0/global/header/hdr-main.gif") 

puts @micropost.errors.messages 
} 
0

這是無效的,因爲你的模型對象沒有通過你的驗證。在你before塊,創建@micropost後,加入這行,看看哪些驗證是失敗

puts @micropost.errors.messages 

會有那些未能驗證(字段和錯誤消息)的哈希值。修復這些,然後你的對象將是有效的。一些較早的評論者就如何開始幫助解決問題提出了建議。

+0

我做到了,它通過了。 '之前{@micropost = user.microposts.build(內容:「Lorem ipsum」, 標題:「這是一個測試標題」, privacy:「1」, groups:「這是一個測試組」, loc1T: 「21債券聖多倫多,安大略省」, loc1Lat: 「43.654653」, loc1Lon: 「-79.377627」, loc2T: 「21債券聖多倫多,安大略省」, loc2Lat: 「43.654653」, loc2Lon: 「-79.377627」, startTime:「Jan 1,2000 12:01:01」, endTime:「Jan 2,2000 12:01:01」, imageURL:「http://i.cdn.turner.com /cnn/.e/img/3.0/global/header/hdr-main。gif「) puts @ micropost.errors.messages }' – Livi17

+0

@ livi1717檢查test.log。日誌中可能有更多線索指出對象無效的原因。 – sorens