Menulis spesifikasi untuk helper dengan Ruby on Rails dan RSpec

Saya telah menulis spesifikasi untuk pengontrol dan model, tetapi saya belum pernah menulis spesifikasi pembantu. Saya tidak tahu harus mulai dari mana.

Saya memiliki cuplikan berikut di application_helper.rb

  def title(page_title)
    content_for(:title) { page_title }
  end
  • Bagaimana saya harus menulis spesifikasi pembantu pada kode?
  • Juga jika ada aplikasi Rails sumber terbuka yang menunjukkan pengujian/spesifikasi pembantu yang baik, beri tahu saya.

person TK.    schedule 03.01.2010    source sumber


Jawaban (5)


RSpec harus secara otomatis memuat kelas dan modul dari lingkungan Rails Anda ketika Anda 'mendeskripsikannya', sehingga spesifikasi pembantu yang valid dapat berupa:

#deleted

Namun perlu diingat bahwa bdd tidak menguji setiap metode, melainkan perilaku aplikasi Anda.

sunting:

seperti yang dikatakan @Ken, spesifikasi saya tidak benar, itu pasti cara yang salah untuk melakukannya. Jadi saya keluar dengan solusi spesifikasi Permintaan yang lebih saya sukai daripada spesifikasi Pembantu.

# 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

jika tidak, jika Anda hanya ingin menguji perilaku pembantu (karena ini penting atau karena Anda tidak memiliki pandangan apa pun) solusi @ Ken lebih baik.

person makevoid    schedule 03.01.2010
comment
Terima kasih banyak atas teladan Anda. BDD yang benar bukan tentang mencakup setiap metode. Kebanyakan metode penolong tersentuh oleh liputan Mentimun/Rcov. - person TK.; 04.01.2010
comment
Ini tidak banyak menguji karena content_for mengembalikan nihil. Anda harus merender halaman dan judul tegas_pilih berisi apa yang Anda harapkan. - person Ken Mayer; 17.04.2010
comment
Ini bukan menguji pembantu, ini menguji sesuatu yang lain, berdasarkan contoh Anda sepertinya sedang menguji file tampilan (mis. Index.html.erb). Tes pembantu seharusnya hanya menguji metode ApplicationHelper#title itu sendiri, tanpa ketergantungan apa pun pada tampilan atau rute/pengontrol. - person Percy; 17.04.2013
comment
Saya biasanya tidak menguji pembantu tampilan sederhana, saya lebih suka spesifikasi permintaan karena mereka menguji perilaku melalui satu fungsi. @KenMayer, saya telah memperbaiki kodenya. - person makevoid; 21.04.2013

Dari dokumen rspec-rails tentang Spesifikasi Helper:

Spesifikasi pembantu ada di spesifikasi/pembantu, dan digabungkan dalam ActionView::TestCase::Behavior.

Menyediakan objek pembantu yang tercampur dalam modul pembantu yang ditentukan, bersama dengan ApplicationHelper (jika ada).

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

Dimungkinkan juga untuk memasukkan pembantu Anda ke dalam kelas tes sebagai berikut:

 describe ApplicationHelper do
   helper ApplicationHelper

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

Bekerja untuk saya dengan Rails 3.

person viphe    schedule 07.02.2011

Dimungkinkan untuk menggunakan sintaks ini ketika ditentukan 'ing pembantu

Misalkan ini adalah penolong Anda

module ApplicationHelper
  def page_title
    @title || nil
  end
end

Kemudian Anda dapat menentukannya dengan sintaks ini

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

Mengurai html dengan ekspresi reguler benar-benar menciptakan kembali roda. Itu terlalu banyak pekerjaan bagi saya: terlalu tidak fleksibel, dan terlalu rawan kesalahan. (Lihat jawaban SO yang sarkastik namun lucu dan akurat tentang alasannya)

Jika Anda perlu mengurai keluaran html oleh pembantu Anda, Anda dapat mencoba permata rspec-html-matchers. Tidak seperti webrat, tampaknya berfungsi baik dengan RSpec 3.

Maka kamu bisa:

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