2014-04-15 4 views
5

Sto scrivendo una specifica su un file all'interno di lib/directory. E uno dei miei metodi in là restituisce una stringa HTML, ma poi cerco qualcosa di simile:Uso di have_selector su un oggetto String in Rails + RSpec

expect(subject).to have_selector("p:eq(1)") do |first_p| 

e mi dà il seguente errore:

Failure/Error: expect(subject).to have_selector("p:eq(1)") do |first_p| 
NoMethodError: 
    undefined method `has_selector?' for #<String:0x007f93798a8338> 

Come posso ovviare a questo? Dovrei avvolgere l'oggetto stringa con qualche altro oggetto specifico? Ho provato con Nokogiri :: HTML.fragment() ma non ha funzionato neanche. Suppongo che dovrei avvolgerlo con qualche oggetto di Webrat o qualcosa del genere, ma non so come arrivarci. Grazie in anticipo.

+0

ho trovato la soluzione qui: http://stackoverflow.com/questions/ 20609043/undefined-method-has-selector-for-rspec-decorators # comment30881536_20621240 - Ho aggiornato la domanda originale con la risposta. – leandroico

+0

Freddo. Grazie per aver condiviso la soluzione. –

+0

Ho rimosso la mia (vecchia) soluzione dalla domanda stessa e ne ho pubblicata una migliore come risposta a questa domanda. Ora sembra la soluzione giusta. – leandroico

risposta

1

non mi sentivo molto soddisfatto su come utilizzare la soluzione type: :view che ho scoperto in precedenza in questa discussione, nonostante sia molto valida. Il fatto è che le mie specifiche per un file all'interno della directory lib/ non dovrebbero essere effettivamente considerate come una specifica di visualizzazione.

Così ho fatto ulteriori ricerche su Internet e ho scoperto quello che mi sembra un approccio migliore.

Quindi considerando l'esempio originale in questo thread. Si deve solo aggiungere la seguente riga all'interno del blocco di descrivere:

include Webrat::Matchers 

Quindi l'esempio finale sarà simile:

describe MyApp::UI::MyDecoratorClass do 
    include Webrat::Matchers 
    # ... 
end 
1

Supponendo che si stia utilizzando Capybara per ottenere il metodo has_selector?, è necessario includere i risultati in Capybara.string(...) per ottenere l'accesso al metodo has_selector?.

Quindi il test dovrebbe andare da:

expect(subject).to have_selector("p:eq(1)") 

A:

result = Capybara.string(subject) 
expect(result).to have_selector("p:eq(1)") 

Documentazione: http://rdoc.info/gems/capybara/Capybara#string-class_method

+0

Questa sarebbe una buona soluzione se il mio stack di app includesse Capybara tra le mie gemme caricate. Non lo stiamo usando a questo punto. – leandroico

+0

Ho appena trovato una buona soluzione, Chris, dai un'occhiata all'altra risposta. – leandroico