2011-11-17 19 views
9

Tôi đang cố gắng tìm ra lý do tại sao rất đơn giản "không băm này có khóa này" spec tôi đang viết là không. Đi vào Ruby REPL của tôi Tôi đang thử những điều sau đây ...RSpec 2.7 và băm nên có_key

[3] pry(main)> a_hash = {:a=>"A"} 
=> {:a=>"A"} 
[4] pry(main)> a_hash.should have_key :a 
NoMethodError: undefined method `have_key' for main:Object 
from (pry):4:in `<main>' 
[5] pry(main)> a_hash.keys.length.should == 1 
=> true 
[8] pry(main)> a_hash.has_key? :a 
=> true 

Thử nghiệm đầu tiên rõ ràng là những gì tôi muốn làm việc và thử nghiệm thứ hai Tôi đang chạy chỉ để xác minh rằng RSpec được nạp trong môi trường REPL của tôi .

Trả lời

4

Bạn cần thực sự làm điều này bên trong một ví dụ RSpec, tôi không nghĩ rằng bạn có thể viết loại mã đó ở bất kỳ đâu.

describe "" do 
    it "has a key" do 
    ... 
    end 
end 
+0

Tôi đồng ý nhưng có một đá quý đẹp mà tôi chưa thử nhưng có vẻ đầy hứa hẹn. https://github.com/amatsuda/interactive_rspec – lucapette

+0

Tôi ban đầu đã viết thông số kỹ thuật của mình trong một tệp 'blah_spec.rb' được bao bọc trong khối' des/it' và ruby ​​đã than phiền 'phương thức chưa xác định' has_key 'cho # (NoMethodError) ' – cfeduke

+0

D'oh! Tôi đã thực sự bỏ lỡ khối 'nó', tôi đã làm nó trực tiếp trong 'mô tả' ... và bây giờ nó hoạt động! – cfeduke

22

Bạn thực sự có thể có đối sánh RSpec bên ngoài khối "khối". Bạn chỉ cần bao gồm RSpec :: Matchers.

[ ~/work/mobile_server (master)]$ irb 
>> require 'rspec' 
true 
>> include RSpec::Matchers 
Object < BasicObject 
>> {a: 1}.should have_key(:a) 
true 
+0

Tôi nghĩ rằng đây chắc chắn là câu trả lời tốt hơn/nhiều thông tin hơn. Cảm ơn thông tin @Costi. –

+0

Trong RSpec 3, bạn nên nhập "expect ({a: 1}) vào has_key (: a)" – Evmorov