2014-04-29 1 views
0

특히 has_content 메소드를 사용하여 내 rspec 테스트에 문제점이 있습니다. 다음은 일부 코드 스 니펫입니다. 나는 당신이 모를 경우에 대비하여 Michael Hartl의 Ruby on Rails 튜토리얼을 따라 왔습니다.#has_content? (String) 항상 false를 반환합니다.

마이크로 포스트가 각각의 내용을 설정하더라도 has_content는 항상 false를 반환합니다.

얻어진 시험

Run options: include {:line_numbers=>[61]} 
..FFF 

Failures: 

1) User pages profile page microposts should have content 0 
Failure/Error: it { should have_content(user.microposts.count) } 
    expected #has_content?(0) to return true, got false 
# ./spec/requests/user_pages_spec.rb:72:in `block (4 levels) in <top (required)>' 

2) User pages profile page microposts should have content "Foo Bar" 
Failure/Error: it { should have_content(m2.content) } 
    expected #has_content?("Foo Bar") to return true, got false 
# ./spec/requests/user_pages_spec.rb:71:in `block (4 levels) in <top (required)>' 

3) User pages profile page microposts should have content "Lorem Ipsum" 
Failure/Error: it { should have_content(m1.content) } 
    expected #has_content?("Lorem Ipsum") to return true, got false 
# ./spec/requests/user_pages_spec.rb:70:in `block (4 levels) in <top (required)>' 

Finished in 0.74407 seconds 
5 examples, 3 failures 

Failed examples: 

rspec ./spec/requests/user_pages_spec.rb:72 # User pages profile page microposts should  have content 0 
rspec ./spec/requests/user_pages_spec.rb:71 # User pages profile page microposts should have content "Foo Bar" 
rspec ./spec/requests/user_pages_spec.rb:70 # User pages profile page microposts should have content "Lorem Ipsum" 

Randomized with seed 43497 

[Finished in 1.3s with exit code 1] 

user_pages_spec.rb

describe "profile page" do 
    let(:user) { FactoryGirl.create(:user) } 
    let(:m1) { FactoryGirl.create(:micropost, user: user, content: "Lorem Ipsum") } 
    let(:m2) { FactoryGirl.create(:micropost, user: user, content: "Foo Bar") } 

    before { visit user_path(user) } 

    it { should have_selector('h1', text: user.name) } 
    it { should have_title(full_title(user.name)) } 

    describe "microposts" do 
     it { should have_content(m1.content) } 
     it { should have_content(m2.content) } 
     it { should have_content(user.microposts.count) } 
    end 
end 

show.hml.erb

<% provide(:title, @user.name) %> 

<div class='row'> 
    <aside class='col-md-4'> 
     <section> 
      <h1> 
       <%= gravatar_for @user, size: 50 %> 
       <%= @user.name %> 
      </h1> 
     </section> 
    </aside> 

    <div class="col-md-8"> 
     <% if @user.microposts.any? %> 
      <h3>Microposts (<%= @user.microposts.count %>)</h3>. 
      <ol class="microposts"> 
       <%= render @microposts %> 
      </ol> 
     <% end %> 
    </div> 
</div> 

_micropost.html.erb

<li> 
    <span class="content"> 
     <%= micropost.content %> 
    </span> 
    <span class="timestamp"> 
     Posted <%= time_ago_in_words(micropost.created_at) %> 
    </span> 
</li> 
012,351,

micropost.erb

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

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

    default_scope { order('microposts.created_at DESC') } 
end 

user.rb

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

    # remaning lines are for validation 

end 

=== EDIT (문제에 대한 답) ===

나는하게 사용! 대신에 각 예제 앞에 메소드의 호출을 강제 실행합니다.

let!(:m1) { FactoryGirl.create(:micropost, user: user, content: "Lorem Ipsum") } 
let!(:m2) { FactoryGirl.create(:micropost, user: user, content: "Foo Bar") } 

답변

1

let 방법은 그래서 당신이 호출 할 때마다 user 새로 만들, 주어진 블록과 방법을 정의하고, 때마다 당신은 m1 또는 m2 새 사용자와 새 micropost을 만들 호출합니다. 대신 다음을 수행하십시오.

before(:each) do 
    @user = FactoryGirl.create(:user) 
    @m1 = FactoryGirl.create(:micropost, user: user, content: "Lorem Ipsum") 
    @m2 = FactoryGirl.create(:micropost, user: user, content: "Foo Bar") 

    visit user_path(@user) 
end 

// Use the instance variables in your tests, or wrap them in methods: 
let(:user) { @user } 
let(:m1) { @m2 } 
let(:m2) { @m1 } 
+0

답변을 주셔서 감사합니다. 대신에 각 예제 앞에 메소드의 호출을 강제 실행합니다. 네가 네 대답을 한 후에 나는 그것을 깨달았다. – oLraX

관련 문제