2013-10-24 18 views
30

Trong RSpec, sự khác biệt giữa it_behaves_likeinclude_examples là gì?Sự khác biệt giữa "include_examples" và "it_behaves_like" là gì?

Các documentation nói:

include_examples - bao gồm (s) các ví dụ trong bối cảnh hiện nay

it_behaves_like "name" - bao gồm (s) các ví dụ trong một bối cảnh lồng nhau

Nhưng những gì điều này thực sự có nghĩa là gì? Thay thế một với người khác dường như không có ảnh hưởng đến việc thử nghiệm của tôi vượt qua hay thất bại. Có một lý do để thích cái khác hơn trong một số trường hợp?

Ngoài ra, là it_should_behave_likeit_behaves_like chỉ là từ đồng nghĩa?

+1

Vui lòng tham khảo: http: //users.cms. caltech.edu/~mvanier/hacking/rants/cars.html, phần Ruby. –

Trả lời

28

Bạn có thể biết cách sử dụng describe, context, itspecify để truyền đạt rõ ràng một khía cạnh của mã của bạn. Ngữ cảnh lồng nhau được cung cấp bởi it_behaves_like có thể được sử dụng để cải thiện giao tiếp này với người đọc.

tôi sẽ căn ví dụ của tôi trên ví dụ được đưa ra trong các tài liệu RSpec cho shared examples:

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 

Nếu bạn chạy RSpec với --format documentation bạn nhận được kết quả như sau:

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

Vì vậy, sự khác biệt là làm thế nào spec được đọc ví dụ như trong trường hợp thất bại.

Phong cách bạn thích là câu hỏi về tính thẩm mỹ về cách bạn muốn thông số kỹ thuật của mình đọc. Hơn nữa, bạn nên đề nghị luôn sử dụng cùng một kiểu nếu bạn làm việc trong một nhóm để cải thiện tính nhất quán.


Ngoài ra, đang it_should_behave_like và it_behaves_like chỉ từ đồng nghĩa?

Hầu như, ngữ cảnh được đặt tên khác. it should behave like ...behaves like .... Một lần nữa là một câu hỏi về thẩm mỹ.

+3

Vì vậy, để làm rõ: trong đó ba tôi sử dụng không có hiệu lực vào việc một thử nghiệm sẽ vượt qua/thất bại, nó chỉ là một sự lựa chọn của thẩm mỹ/dễ đọc? – GMA

+0

@GeorgeMillo chính xác :) – jayeff

12

sự khác biệt trong trường hợp bạn chuyển tham số cho shared_examples.

Nó giải thích rất tốt trong một cảnh báo in their doc:

Chú ý: Khi bạn đưa ví dụ tham số trong nhiều bối cảnh hiện nay lần, bạn có thể ghi đè lên các định nghĩa phương pháp trước đó và chiến thắng tuyên bố cuối cùng. Vì vậy, nếu bạn có loại ví dụ chia sẻ (hoặc bối cảnh chia sẻ)

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 

Bạn đang thực sự làm điều này (chú ý rằng ví dụ đầu tiên sẽ thất bại):

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 

Để ngăn chặn loại lỗi tinh tế này, cảnh báo được phát ra nếu bạn khai báo nhiều phương thức có cùng tên trong cùng một ngữ cảnh. Nếu bạn có được điều này cảnh báo các giải pháp đơn giản nhất là để thay thế include_examples với it_behaves_like, trong phương pháp cách này trọng được tránh vì bối cảnh lồng nhau tạo ra bởi it_behaves_like

Các vấn đề liên quan