2010-01-12 29 views
31

Tôi đang cố gắng kiểm tra xem một hành động mới trong bộ điều khiển RESTful của tôi đã thiết lập một biến mẫu của kiểu đối tượng được yêu cầu chưa. Có vẻ khá điển hình, nhưng gặp khó khăn trong thực hiện nóLàm thế nào để kiểm tra biến cá thể được khởi tạo trong bộ điều khiển với RSpec

điều khiển khách hàng

def new 
    @client = Client.new 
end 

thử nghiệm

describe "GET 'new'" do 
    it "should be successful" do 
    get 'new' 
    response.should be_success 
    end 

    it "should create a new client" do 
    get 'new' 
    assigns(:client).should == Client.new 
    end 
end 

Kết quả trong ...

 
'ClientsController GET 'new' should create a new client' FAILED 
    expected: #, 
     got: # (using ==) 

Có lẽ vì nó đang cố gắng so sánh 2 bản ghi hoạt động, khác nhau. Vì vậy, làm thế nào để kiểm tra xem bộ điều khiển thiết lập một biến cá thể chứa một cá thể mới của mô hình Client.

Trả lời

33

technicalpickles trong #rspec giúp tôi ra ...

assigns(:client).should be_kind_of(Client) 
+0

Nếu Im làm việc với REST và tôi không sử dụng "@" trong bộ điều khiển thì sao? Có cách giải quyết nào không? Cảm ơn – Luccas

+2

Không hoạt động cho đường ray 5. Idiotic ... – asiniy

+3

Đối với đường ray 5, sử dụng 'expect (assigns (: client) .to be_a (Client)' – heyitsjhu

13

Bạn có thể sử dụng new_record Rails'? phương pháp để kiểm tra xem một trường hợp nhất định đã được lưu vào cơ sở dữ liệu đã được hay không:

assigns(:client).should be_a(Client) 
assigns(:client).should be_new_record 

(Bạn không thể sử dụng chuyển nhượng [: client] vì những lý do lịch sử, theo: http://guides.rubyonrails.org/testing.html#the-four-hashes-of-the-apocalypse)

+0

liên kết tới "four-hashes-of-the-apocalypse" giải thích mọi thứ mà một Rails dev cần biết về các khung nhìn môi trường nhận được từ các bộ điều khiển! – Epigene

9

Cho rằng 2016 RSpec cú pháp v3 sử dụng:

expect(assigns(:client)).to be_a(Client) 

Ngoài ra, đối những người khác mà có thể dừng lại ở đây vì tiêu đề câu hỏi, ở đây là làm thế nào để kiểm tra xem một ví dụ biến @client được thiết lập để bất cứ điều gì

# in controller action 
@client = Client.find_by(name: "John") 

# spec assignment based on collection membership 

expect(assigns.keys).to include('client') 

Xem @Attila Györffy's answer về lý do tại sao băm gán phải được truy cập bằng các phím chuỗi.

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