Ошибка Rails с rspec: ожидаемо верно? вернуть true, получить false

Я новичок в рельсах, и после завершения учебника по Ruby on Rails Майкла Хартла я пытаюсь расширить некоторые функциональные возможности. Я начал с изменения микросообщений, чтобы они собирали больше данных.

При запуске теста 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

микропост.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

Я не уверен, есть ли что-то еще, что вам нужно, чтобы я опубликовал.


person Livi17    schedule 11.10.2012    source источник
comment
Вы можете указать значение микросообщения и проверить его значение.   -  person Paritosh Singh    schedule 11.10.2012
comment
как указать значение микросообщения и проверить его значение?   -  person Livi17    schedule 11.10.2012
comment
используйте оператор puts в каком-нибудь тестовом примере, а затем запустите спецификацию bundle exec rspec, он напечатает ваш микросообщение, например ..........microspost: blah.F......   -  person Paritosh Singh    schedule 11.10.2012
comment
Спасибо за помощь, но я новичок в рельсах. Я не знаю, в какой файл добавить оператор puts. Что я должен добавить в файл . Гугление ставит заявление не помогает.   -  person Livi17    schedule 11.10.2012
comment
вы знаете, что делают puts в рельсах   -  person Paritosh Singh    schedule 11.10.2012
comment
Каждый из ваших блоков before перезаписывает @micropost, так что они практически уничтожают друг друга. Это первое, что я бы исправил. У вас есть те же данные на вашей фабрике, поэтому вы должны использовать их.   -  person Chris Salzberg    schedule 11.10.2012
comment
Честно говоря, не хочу обескураживать, но здесь вы не получите хороших ответов, потому что с этим кодом слишком много проблем.   -  person Chris Salzberg    schedule 11.10.2012
comment
Я прокомментировал предыдущие блоки, и теперь это проходит.   -  person Livi17    schedule 11.10.2012


Ответы (2)


Это недействительно, потому что ваш объект модели не проходит ваши проверки. В своем блоке before после создания @micropost добавьте эту строку, чтобы увидеть, какие проверки не пройдены.

puts @micropost.errors.messages

Будет хэш проверок (полей и сообщений об ошибках), которые не прошли. Исправьте их, и тогда ваш объект будет действительным. У некоторых предыдущих комментаторов были предложения о том, с чего начать, чтобы решить проблему.

person sorens    schedule 11.10.2012
comment
Я сделал это, и это проходит. 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 } - person Livi17; 11.10.2012
comment
@ livi1717 Проверьте test.log. В журнале может быть больше подсказок, почему объект недействителен. - person sorens; 11.10.2012

Это избавило от ошибок.

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
}
person Livi17    schedule 12.10.2012