2013-01-08 32 views
17

Tôi đang cố gắng để kiểm tra nếu một mảng bao gồm một (rspec 2.11.0)Mảng rspec nên bao gồm như thế nào? một mảng

test_arr = [1, 3] 

describe [1, 3, 7] do 
    it { should include(1,3) } 
    it { should eval("include(#{test_arr.join(',')})")} 
    #failing 
    it { should include(test_arr) } 
end  

này là kết quả rspec đặc tả/test.spec ..F

Failures: 

    1) 1 3 7 
    Failure/Error: it { should include(test_arr) } 
     expected [1, 3, 7] to include [1, 3] 
    # ./spec/test.spec:7:in `block (2 levels) in <top (required)>' 

Finished in 0.00125 seconds 
3 examples, 1 failure 

Failed examples: 

rspec ./spec/test.spec:7 # 1 3 7 

Các bao gồm rspec mehod không chấp nhận một đối số mảng, theres một cách tốt hơn để tránh "eval"?

Trả lời

31

Chỉ cần sử dụng splat (*) điều hành, trong đó mở rộng một loạt các yếu tố vào một danh sách các đối số mà có thể được chuyển đến một phương pháp:

test_arr = [1, 3] 

describe [1, 3, 7] do 
    it { should include(*test_arr) } 
end 
+0

liên kết rất thú vị – GioM

+2

OMG! Đây là tâm-thổi ... nghiêm trọng, điều này thực sự thực sự hữu ích trong thông số kỹ thuật, tôi không biết # bao gồm danh sách các đối số được hỗ trợ. Cảm ơn bạn! –

4

Nếu bạn muốn xác nhận đơn đặt hàng của mảng phụ, bạn sẽ cần phải thực hiện nhiều hơn should include(..), bởi vì công cụ so khớp include của RSpec chỉ xác nhận rằng mỗi phần tử hiển thị ở bất kỳ đâu trong mảng, không phải tất cả các đối số đều hiển thị theo thứ tự.

tôi đã kết thúc bằng each_cons để xác minh rằng phụ mảng có mặt trong trật tự, như thế này:

describe [1, 3, 5, 7] do 
    it 'includes [3,5] in order' do 
    subject.each_cons(2).should include([3,5]) 
    end 

    it 'does not include [3,1]' do 
    subject.each_cons(2).should_not include([3,1]) 
    end 
end 
Các vấn đề liên quan