2015-05-04 9 views
7

W moim Dashboard#Index, mam to:Jak przetestować zmienną lokalną wewnątrz kontrolera z Rspec?

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

Jak przetestować to z RSpec?

Próbowałem:

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

Ale to daje mi ten błąd:

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

Odpowiedz

9

nie można (i nie powinien) badanie zmienne lokalne. Można jednak i należy testować zmienne instancji, które rozpoczynają się od @. Do tego używasz pomocnika assigns, przekazując mu nazwę zmiennej instancji jako symbol. Jeśli chcemy wartość zmiennej instancji @tagged_nodes, nazywamy assigns(:tagged_nodes) (zauważmy :).

Więc jeśli metoda kontroler wygląda następująco:

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

... byś dostęp @tagged_nodes z assigns(:tagged_nodes):

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

Yeh .... wiem jak przetestować zmienne instancji. Więc czy nie powinienem mieć żadnych zmiennych lokalnych w moim kontrolerze? – marcamillion

+2

Możesz mieć zmienne lokalne, ale nie musisz ich testować. Powinieneś przetestować zewnętrzne zachowanie kontrolera: biorąc pod uwagę określone żądanie, jaką odpowiedź daje (lub jakie dane przekazuje do widoku). Zmienne lokalne to stan prywatny i ogólnie nie testujesz stanu prywatnego. –

+0

Ahh ok. To ma sens. – marcamillion

0

Spróbuj kod:

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

byś dostęp do tagged_nodes z controller.tagged_nod es

expect(controller.tagged_nodes) 
    .to match Node.includes(:user_tags).tagged_with(u1.email) 
Powiązane problemy