2014-12-24 4 views
0

여기에 잘못된 트리를 짖을 수도 있지만, 레일 뷰 스펙을위한 룩업 테이블을 작성하려고합니다. 나는 '뷰 스펙의 링크를위한 룩업 테이블 작성하기

require 'rails_helper' 

RSpec.describe 'layouts/_navigation', :type => :view do 

    context 'everyone' do 
    before :each do 
     allow(view).to receive(:user_signed_in?).and_return(false) 
     render 
    end 


    it {should have_valid_link(I18n.t(:start_reading), stories_path)} 
    it {should have_valid_link(I18n.t(:unknown_tales), root_path)} 
    end 
end 

: 나는 이것을 대체 할 수 있도록하고 싶습니다 무엇

require 'rails_helper' 

RSpec.describe 'layouts/_navigation', :type => :view do 

    context 'everyone' do 
    before :each do 
     allow(view).to receive(:user_signed_in?).and_return(false) 
     render 
    end 

    it 'shows links to start reading' do 
     expect(rendered).to have_link(I18n.t(:start_reading), :href => stories_path) 
    end 

    it 'shows links to home page' do 
     expect(rendered).to have_link(I18n.t(:unknown_tales), root_path) 
    end 
    end 
end 

이 같은 것입니다 :

는 지금 내가 이렇게 보이는 뷰 스펙을 가지고 다음과 같이 찔러 보았지만 작동하지 않습니다.

RSpec::Matchers.define :have_valid_link do |title, path| 
    description { "have valid link to #{path} on #{title}" } 

    match do |rendered| 
    expect(rendered).to have_link(title, :href => path) 
    end 

end 

잘 작동하지 않는지는 확실하지 않습니다. beca use 나는 잘못하고있다, 또는 shoulda matchers가 view와 함께 작동하도록 설계되지 않았다면.

감사

답변

1

나는이 접근의 대체/간단한 방법이있을 수 있다는 점에서이 답변 완전히 확신 아니지만, 여기 내 이해입니다 : 내가 생각

  • 그냥이다 정규 RSpec "matcher"를 찾으십시오. shoulda은 특정 matcher 세트가 포함 된 보석입니다.

  • 명시 적 또는 묵시적으로 subject을 통해 rendered을 matcher에 전달해야합니다.

  • 당신의 정규 표현식은 Capybara matchers를 사용하기 위해 렌더링 된 문자열을 Capybara 노드로 변환해야합니다. Capybara.string

  • 통해 match 방법이 당신을 제공, expect

함께 찍은 호출, 부울을하지 반환 할 것으로 예상된다

require 'rails_helper' 

RSpec::Matchers.define :have_valid_link do |title, path| 
    description { "have valid link to #{path} on #{title}" } 

    match do |rendered| 
    Capybara.string(rendered).has_link?(title, :href => path) 
    end 
end 

RSpec.describe 'layouts/_navigation', :type => :view do 
    context 'everyone' do 
    subject { rendered } 

    before :each do 
     allow(view).to receive(:user_signed_in?).and_return(false) 
     render 
    end 

    it {should have_valid_link(I18n.t(:start_reading), stories_path)} 
    it {should have_valid_link(I18n.t(:unknown_tales), root_path)} 
    end 
end 
+0

이 답변 주셔서 감사합니다,하지만 '아무튼 일하지 마라. 나는'render '의 값이'everyone'이라는 문자열이기 때문에'Reading'에 대한 유효한 링크를 가지고 있거나'Read Reading을 읽을 때'모두가'expected "라고 말하고 있습니다. 렌더링 된 뷰에 액세스하는 또 다른 방법이 있습니까? –

+0

내 대답에 명시된대로 코드를 시도 했습니까? 'subject {rendered} '를 지정하지 않으면보고있는 동작 (즉, "everyone"의 암시적인'subject')을 얻을 수 있습니다. –

+0

죄송합니다. 제 상태가 좋지 않습니다.'subject {rendered}'행을 추가하지 못했습니다. 너는 별이야, 고마워. –