2016-05-13 7 views
0

Ich implementiere Seitenobjekte und schreibe Tests, um sie zu überprüfen. Ich möchte die Tests vereinfachen, indem ich die Elementnamen in einem Array von Symbolen abspeichern und durchlaufen kann, aber es schlägt fehl.Objekt.respond_to? Fehler beim Abrufen des Methodennamensymbols aus Array

def setup 
    @browser = Watir::Browser.new :phantomjs 
    @export_page = ExportPage.new @browser 
    @assets = %i{:section :brand} 
end 

-

#PASSES 

def test_static 
    $stdout.puts :section.object_id 
    raise PageElementSelectorNotFoundException, :section unless @export_page.respond_to? :section 
end 

> # 2123548 

Dies passiert, weil die Zielklasse diese Methode nicht implementiert, aber:

#FAILS 

def test_iterator 
    @assets.each do |selector| 
    $stdout.puts selector.class 
    $stdout.puts selector.object_id 
    $stdout.puts :section.object_id 
    raise PageElementSelectorNotFoundException, selector unless @export_page.respond_to? selector 
    end 
end 


> # Testing started at 11:19 ... 
> # Symbol 
> # 2387188 
> # 2123548 

PageElementSelectorNotFoundException: :section missing from page 
~/src/stories/test/pages/export_page_test.rb:20:in `block in test_iterator' 

Wie Sie sehen können, habe ich die Objekt-IDs der überprüft haben Symbole und sie scheinen anders zu sein. Könnte das der Grund sein, warum es scheitert? Gibt es dafür eine Lösung?

Antwort

1

Wenn Kurzschreibweise unter Verwendung einer Anordnung von Atomen zu erklären, sollte man Doppelpunkte nicht dort setzen:

- %i{:section :brand} # incorrect 
+ %i{section brand}  # correct 

Was Sie eigentlich von @assets = %i{:section :brand} definiert haben, ist die folgende Reihe:

[:':section', :':brand'] 
+0

Vielen Dank. Es war ein Schuljungsfehler, oder? Ich werde diese wählen, weil es eine prägnantere Antwort ist und es idiomatische Ruby fördert. –

+1

Ich würde es eher ein Tippfehler als von einem Schuljungen Fehler halten :) – mudasobwa

0

Don Verwenden Sie nicht die Schreibweise% i {}, da sie automatisch ein Symbol für die von Ihnen angegebenen Literale erstellt.

Dies führt zu:

@assets = [:":section", :":brand"] 

was technisch eine Reihe von Symbolen ist, nur nicht die Symbole, die Sie bestimmt. Aus diesem Grund stimmen die Objekt-IDs in Ihren Tests nicht überein.

Die% i {} -Syntax wurde in Ruby 2.0 hinzugefügt. Verwenden Sie bei Verwendung in Code, der möglicherweise ältere Ruby-Versionen unterstützt, ein herkömmliches Symbolfeld:

@assets = [:section, :brand] 
+0

Ihre Antwort enthält: falsche Beratung zu verwenden '% i', Syntaxfehler in der einzigen LOC, die Sie zur Verfügung gestellt und abgesehen davon, dass es eine flache Kopie von mir ist . Ich frage mich, was war der Grund, es zu veröffentlichen? – mudasobwa

+0

@mudasobwa Ich habe deine Antwort nicht kopiert, weil sie nicht existierte, als ich anfing, meine Antwort zu schreiben. –

+0

Ich habe nie gesagt, dass Sie etwas _explicitly kopiert_ haben, ich sagte, dass, als es veröffentlicht wurde, es schien, eine Kopie zu sein. OK, Sie haben einen Syntaxfehler behoben, bitte entfernen Sie zumindest einen _wrong_ advise, um '% i' nicht zugunsten von' [: section,: brand] 'zu verwenden, das rubinische idiomatische Konzepte sowie den gesunden Menschenverstand verletzt. – mudasobwa

Verwandte Themen