Pertanyaan Apa perbedaan antara "include_examples" dan "it_behaves_like"?


Di RSpec, apa bedanya it_behaves_like dan include_examples?

Itu dokumentasi mengatakan:

include_examples - sertakan (s) contoh-contoh dalam konteks saat ini

it_behaves_like "name" - sertakan (s) contoh dalam konteks bersarang

Tapi sebenarnya apa artinya ini? Mengganti yang satu dengan yang lain sepertinya tidak berpengaruh pada apakah tes saya lulus atau gagal. Adakah alasan untuk memilih salah satu dari yang lain dalam beberapa situasi?

Juga, adalah it_should_behave_like dan it_behaves_like hanya sinonim?


32
2017-10-24 03:18


asal


Jawaban:


Anda mungkin tahu cara menggunakannya describe, context, it dan specify untuk mengkomunikasikan dengan jelas satu aspek dari kode Anda. Konteks bersarang yang disediakan oleh it_behaves_like dapat digunakan untuk meningkatkan komunikasi ini dengan pembaca.

Saya akan mendasarkan contoh saya pada contoh yang diberikan dalam dokumentasi RSpec untuk berbagi contoh:

shared_examples "a collection" do
  context "initialized with 3 items" do
    it "says it has three items" do
      # ...
    end
  end
end

describe Array do
  it_behaves_like "a collection"
  include_examples "a collection"
end

Jika Anda menjalankan RSpec dengan --format documentation Anda mendapatkan output berikut:

Array
  behaves like a collection
    initialized with 3 items
      says it has three items
  initialized with 3 items
    says it has three items

Jadi perbedaannya adalah bagaimana spec dibaca misalnya jika terjadi kegagalan.

Gaya yang Anda sukai adalah pertanyaan tentang estetika bagaimana Anda menyukai spesifikasi Anda untuk dibaca. Selanjutnya Anda akan menyarankan untuk selalu menggunakan gaya yang sama jika Anda bekerja di tim untuk meningkatkan konsistensi.


Juga, apakah it_should_behave_like dan it_behaves_like hanya sinonim?

Hampir, konteksnya diberi nama berbeda. it should behave like ... vs behaves like .... Sekali lagi pertanyaan tentang estetika.


30
2017-10-24 04:52



Sana aku s perbedaan jika Anda melewatkan parameter ke shared_examples.

Itu dijelaskan dengan sangat baik dalam sebuah peringatan di dokumen mereka:

PERINGATAN: Saat Anda menyertakan contoh parameter dalam konteks saat ini beberapa   kali, Anda dapat mengganti definisi metode sebelumnya dan kemenangan deklarasi terakhir.   Jadi, jika Anda memiliki contoh yang dibagikan ini (atau konteks bersama)

RSpec.shared_examples "some example" do |parameter|
  \# Same behavior is triggered also with either `def something; 'some value'; end`
  \# or `define_method(:something) { 'some value' }`
  let(:something) { parameter }
  it "uses the given parameter" do
    expect(something).to eq(parameter)
  end
end

RSpec.describe SomeClass do
  include_examples "some example", "parameter1"
  include_examples "some example", "parameter2"
end

Anda benar-benar melakukan ini (perhatikan bahwa contoh pertama akan gagal):

RSpec.describe SomeClass do
  \# Reordered code for better understanding of what is happening
  let(:something) { "parameter1" }
  let(:something) { "parameter2" }

  it "uses the given parameter" do
    \# This example will fail because last let "wins"
    expect(something).to eq("parameter1")
  end

  it "uses the given parameter" do
    expect(something).to eq("parameter2")
  end
end

Untuk mencegah kesalahan halus semacam ini, sebuah peringatan dipancarkan jika Anda   menyatakan beberapa metode dengan nama yang sama dalam konteks yang sama.   Jika Anda mendapatkan peringatan ini, solusi yang paling sederhana adalah mengganti   include_examples dengan it_behaves_like, dengan cara ini metode override   dihindari karena konteks bersarang yang dibuat oleh it_behaves_like


13
2017-07-25 20:40