2012-11-30 30 views
10

Vì vậy, tôi đã khá chắc chắn điều này sẽ làm việc ...Làm thế nào để kiểm tra xem có sự thay đổi từ Nil trong RSpec

expect { file.send(:on_io) {} }.to change{ 
    file.io.class 
}.from(NilClass).to(File) 

nhưng nó không thành công với thông điệp này ...

result should have initially been NilClass, but was NilClass 

Hu?

Trước hết, tại sao điều này trở lại dưới dạng lỗi? Thứ hai, tôi biết bình thường bạn có thể kiểm tra số nil với be_nil bằng cách sử dụng phương thức nil?. Có một số cách đặc biệt để làm điều này với một from().to() trong RSpec?

Trả lời

11

này nên làm việc:

expect { file.send(:on_io) {} }.to change{ 
    file.io 
}.from(NilClass).to(File) 

rspec sẽ sử dụng === để so sánh giá trị trong fromto. Nhưng === không giao hoán, và khi được gọi trên một lớp, nó sẽ kiểm tra nếu đối số của nó là một thể hiện của lớp. Vì vậy:

NilClass === NilClass 
#=> false 

Vì NilClass không phải là trường hợp của NilClass. Mặt khác,

NilClass === nil 
#=> true 
nil === nil 
#=> true 
nil === NilClass 
#=> false 

Vì nil là một thể hiện của NilClass, nil bằng 0 nhưng không bằng NilClass.

Bạn cũng có thể viết thử nghiệm của bạn theo cách đó:

expect { file.send(:on_io) {} }.to change{ 
    file.io 
}.from(nil).to(File) 

mà tôi nghĩ là có thể đọc được hầu hết.

+0

nếu 'nil === NilClass' trả về false, không phải' file.io === File' cũng trả về false (giả sử 'file.io' là một thể hiện của' File') không? – webdesserts

+1

Nhưng thử nghiệm sẽ là 'File === file.io', đó là toàn bộ điểm :) –

+1

Ahh ok, các đối số trong' to' và 'from' được so sánh với giá trị trả về thay vì ngược lại. Có ý nghĩa. Cảm ơn bạn đã giải thích mọi thứ tốt! – webdesserts

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