2015-05-04 17 views
7

Trong Dashboard#Index của tôi, tôi có điều này:Làm cách nào để kiểm tra biến cục bộ bên trong bộ điều khiển với Rspec?

def index   
    tagged_nodes = Node.includes(:user_tags).tagged_with(current_user.email)  
    end 

Làm thế nào để kiểm tra điều này với RSpec?

tôi đã cố gắng:

expect(assigns(tagged_nodes)).to match Node.includes(:user_tags).tagged_with(u1.email) 

Nhưng điều đó mang lại cho tôi lỗi này:

NameError: 
     undefined local variable or method `tagged_nodes' for #<RSpec::ExampleGroups::DashboardController::GETIndex:0x007fe4edd7f058> 

Trả lời

9

Bạn không thể (và không nên) kiểm tra các biến địa phương. Tuy nhiên, bạn có thể và nên thử nghiệm các biến số dụ, là các biến bắt đầu bằng @. Đối với điều đó, bạn sử dụng trình trợ giúp assigns, chuyển tên của biến mẫu đó làm biểu tượng. Nếu chúng ta muốn giá trị của biến cá thể @tagged_nodes, chúng tôi gọi assigns(:tagged_nodes) (lưu ý :).

Vì vậy, nếu phương pháp điều khiển của bạn trông như thế này:

def index   
    @tagged_nodes = Node.includes(:user_tags).tagged_with(current_user.email)  
end 

... bạn sẽ truy cập @tagged_nodes với assigns(:tagged_nodes):

expect(assigns(:tagged_nodes)) 
    .to match Node.includes(:user_tags).tagged_with(u1.email) 
+0

Yeh .... Tôi biết cách kiểm tra biến mẫu. Vì vậy, tôi không nên có biến địa phương trong bộ điều khiển của tôi? – marcamillion

+2

Bạn có thể có các biến cục bộ, nhưng bạn không cần kiểm tra chúng. Bạn nên kiểm tra hành vi bên ngoài của bộ điều khiển: đưa ra một yêu cầu nhất định, đáp ứng nào cho nó (hoặc dữ liệu nào nó chuyển tới khung nhìn). Biến cục bộ là trạng thái riêng và nói chung bạn không kiểm tra trạng thái riêng tư. –

+0

Ahh ok. Điều đó có ý nghĩa. – marcamillion

0

Hãy thử mã này:

def index   
    tagged_nodes = Node.includes(:user_tags).tagged_with(current_user.email)  
end 

bạn sẽ truy cập tagged_nodes với controller.tagged_nod es

expect(controller.tagged_nodes) 
    .to match Node.includes(:user_tags).tagged_with(u1.email) 
Các vấn đề liên quan