การเขียนข้อมูลจำเพาะสำหรับผู้ช่วยเหลือด้วย Ruby on Rails และ RSpec

ฉันเขียนข้อมูลจำเพาะสำหรับคอนโทรลเลอร์และรุ่นต่างๆ แต่ฉันไม่เคยเขียนข้อมูลจำเพาะตัวช่วยเลย ฉันไม่รู้ว่าจะเริ่มจากตรงไหน

ฉันมีตัวอย่างต่อไปนี้ใน application_helper.rb

  def title(page_title)
    content_for(:title) { page_title }
  end
  • ฉันจะเขียนข้อมูลจำเพาะตัวช่วยในโค้ดได้อย่างไร
  • นอกจากนี้ หากมีแอป Rails แบบโอเพ่นซอร์สใด ๆ ที่แสดงการทดสอบ/ข้อมูลจำเพาะของตัวช่วยที่ดี โปรดแจ้งให้เราทราบด้วย

person TK.    schedule 03.01.2010    source แหล่งที่มา


คำตอบ (5)


RSpec ควรโหลดคลาสและโมดูลจากสภาพแวดล้อม Rails ของคุณโดยอัตโนมัติเมื่อคุณ 'อธิบาย' ดังนั้นข้อมูลจำเพาะตัวช่วยที่ถูกต้องอาจเป็น:

#deleted

แต่โปรดจำไว้ว่า bdd ไม่ได้ทดสอบทุกวิธี แต่เป็นพฤติกรรมของแอปพลิเคชันของคุณ

แก้ไข:

อย่างที่ @Ken กล่าวไว้ สเป็คของฉันไม่ถูกต้อง มันเป็นวิธีที่ผิดอย่างแน่นอน ดังนั้นฉันจึงออกมาพร้อมกับโซลูชันคำขอข้อมูลจำเพาะที่ฉันชอบมากกว่าข้อมูลจำเพาะตัวช่วยเหลือ

# inside your helper
def title=(page_title)
  content_for(:title) { page_title }
end

# views/resource/index.html.erb
<% title = "foo" %>

# views/layouts/application.html.erb
<%= yield :title %>

# request spec
require 'spec_helper'

describe YourResource do
  it "should output content for title"
    get "/resource"
    response.body.should =~ /<title>foo<\/title>/
  end
end

มิฉะนั้น หากคุณต้องการทดสอบเฉพาะพฤติกรรมของตัวช่วย (เพราะมันสำคัญหรือเพราะคุณไม่มีมุมมอง) วิธีแก้ปัญหาของ @Ken ดีกว่า

person makevoid    schedule 03.01.2010
comment
ขอบคุณมากสำหรับตัวอย่างของคุณ BDD ที่ถูกต้องไม่ได้เกี่ยวกับการครอบคลุมทุกวิธี วิธีการช่วยเหลือส่วนใหญ่สัมผัสได้ถึงความครอบคลุมของแตงกวา/อาร์โคฟ - person TK.; 04.01.2010
comment
สิ่งนี้ไม่ได้ทดสอบมากนักเนื่องจาก content_for ส่งคืนศูนย์ คุณควรเรนเดอร์เพจและ assert_select title มีสิ่งที่คุณคาดหวัง - person Ken Mayer; 17.04.2010
comment
นี่ไม่ใช่การทดสอบตัวช่วย แต่เป็นการทดสอบอย่างอื่น ตามตัวอย่างของคุณ ดูเหมือนว่ากำลังทดสอบไฟล์มุมมอง (เช่น index.html.erb) การทดสอบตัวช่วยควรทดสอบเมธอด ApplicationHelper#title เอง โดยไม่ต้องพึ่งพามุมมองหรือเส้นทาง/ตัวควบคุม - person Percy; 17.04.2013
comment
โดยปกติฉันจะไม่ทดสอบตัวช่วยดูแบบธรรมดา ฉันชอบข้อกำหนดคำขอเนื่องจากจะทดสอบพฤติกรรมมากกว่าฟังก์ชันเดียว @KenMayer ฉันได้แก้ไขรหัสแล้ว - person makevoid; 21.04.2013

จากเอกสาร rspec-rails ใน Helper Specs:

ข้อมูลจำเพาะของตัวช่วยอยู่ในข้อมูลจำเพาะ/ตัวช่วย และผสมใน ActionView::TestCase::Behavior

จัดเตรียมวัตถุตัวช่วยที่ผสมในโมดูลตัวช่วยที่ระบุพร้อมกับ ApplicationHelper (ถ้ามี)

require 'spec_helper'
describe ApplicationHelper do
  describe "#title" do
    it "displays the title" do
      # helper is an instance of ActionView::Base configured with the
      # ApplicationHelper and all of Rails' built-in helpers
      expect(helper.title).to match /Some Title/
    end
  end 
end
person plainjimbo    schedule 11.10.2012

นอกจากนี้ยังสามารถรวมผู้ช่วยของคุณไว้ในชั้นเรียนทดสอบได้ดังนี้:

 describe ApplicationHelper do
   helper ApplicationHelper

   it "should work" do
     my_helper_method("xyz").should == "result for xyz"
   end
 end

ทำงานให้ฉันด้วย Rails 3

person viphe    schedule 07.02.2011

คุณสามารถใช้ ไวยากรณ์นี้ เมื่อระบุ กำลังเป็นผู้ช่วย

สมมติว่านี่คือผู้ช่วยของคุณ

module ApplicationHelper
  def page_title
    @title || nil
  end
end

จากนั้นคุณสามารถระบุด้วยไวยากรณ์นี้ได้

require "spec_helper"

describe ApplicationHelper do
  describe "#page_title" do
    it "returns the instance variable" do
      assign(:title, "My Title")
      helper.page_title.should eql("My Title")
    end
  end
end
person Fabio    schedule 24.11.2011

การแยกวิเคราะห์ html ด้วยนิพจน์ทั่วไปถือเป็นการสร้างวงล้อขึ้นมาใหม่จริงๆ นั่นเป็นงานที่หนักเกินไปสำหรับฉัน: ไม่ยืดหยุ่นเกินไปและเสี่ยงต่อข้อผิดพลาดมากเกินไป (ดูคำตอบ SO เชิงประชดแต่เฮฮาและแม่นยำเกี่ยวกับเหตุผล)

หากคุณต้องการแยกวิเคราะห์เอาต์พุต html โดยผู้ช่วยของคุณ คุณอาจลองใช้ gem rspec-html-matchers. ต่างจาก webrat ตรงที่ดูเหมือนว่าจะเล่นได้ดีกับ RSpec 3

จากนั้นคุณสามารถ:

expect(helper.title).to have_tag('title', text: 'What you expect')
person Loren    schedule 17.07.2015