2015-05-04 8 views
7

In meinem Dashboard#Index, ich habe dies:Wie teste ich eine lokale Variable in einem Controller mit Rspec?

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

Wie teste ich dies mit RSpec?

Ich habe versucht:

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

Aber das gibt mir diese Fehlermeldung:

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

Antwort

9

Sie können nicht (und sollte nicht) Test lokalen Variablen. Sie können und sollten jedoch Instanz Variablen testen, die mit @ beginnen. Dazu verwenden Sie den assigns Helfer und übergeben ihm den Namen der Instanzvariablen als Symbol. Wenn wir den Wert der Instanzvariable @tagged_nodes möchten, rufen wir assigns(:tagged_nodes) (beachten Sie die :).

Also, wenn Ihr Controller-Methode sieht wie folgt aus:

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

... Sie @tagged_nodes zugreifen würde mit assigns(:tagged_nodes):

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

Yeh .... Ich weiß, wie Instanzvariablen zu testen. Sollte ich also keine lokalen Variablen in meinem Controller haben? – marcamillion

+2

Sie können lokale Variablen verwenden, müssen diese jedoch nicht testen. Sie sollten das äußere Verhalten des Controllers testen: Bei einer bestimmten Anfrage, welche Antwort gibt es (oder welche Daten es an die Ansicht übergibt). Lokale Variablen sind privater Status und Sie testen den privaten Status im Allgemeinen nicht. –

+0

Ahh ok. Das macht Sinn. – marcamillion

0

diesen Code Versuchen:

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

würden Sie Zugriff getagged_nodes mit controller.tagged_nod es

expect(controller.tagged_nodes) 
    .to match Node.includes(:user_tags).tagged_with(u1.email) 
Verwandte Themen