Webrat i wypełnianie formularzy na zewnętrznych stronach

Piszę sobie testy w “ogórku”. Moja aplikacja korzysta z OAuth Blipa, dlatego też do zalogowania/rejestracji potrzebne jest wysłanie jednego formularza na zewnętrznej stronie.

W jednym z plików *_steps.rb napisałem taki kod:

[code “Ruby”]Given /^I am logged in$/ do
get ‘http://m.blip.pl
fill_in(‘login’, :with => BLIP_LOGIN[:username])
fill_in(‘hasło’, :with => BLIP_LOGIN[:password])
click_button

get ‘/login’
click_button “Zaloguj się używając OAuth” # button na mojej stronie, po kliknięciu następuje przekierowanie
click_button “Zapisz zmiany” # button na stronie Blipa
end
[/code]

Jednak wygląda na to, że Webrat nie odwiedza nawet m.blip.pl, bo wyrzuca błąd:

Could not find field: "login" (Webrat::NotFoundError)

Spróbowałem z GitHubem - to samo. Próbowałem również bezskutecznie użyć metody host!. Mógłbym zresztą od razu wysłać zapytanie pod m.blip.pl/sessions z odpowiednimi parametrami, ale oczywiście najpierw Webrat musiałby widzieć te zewnętrzne domeny.

Istnieje jakiś sposób, żeby posiadać zalogowanego użytkownika na Blipie w tej sesji Webrata czy pozostaje mi po prostu wklepanie @current_user = User.create(…)?

Zamiast get 'http://m.blip.pl'
spróbuj visit 'http://m.blip.pl'

GhandaL, tego też próbowałem :wink: Nadal ten sam błąd.

W takim razie pokaż co masz w env.rb, ewentualnie wrzuć tam coś w tym stylu:

[code=Ruby]require ‘webrat’
require ‘spec’

Webrat.configure do |config|
config.mode = :mechanize
end

class WebratWorld
include Spec::Matchers
include Webrat::Methods
include Webrat::Matchers
end

World do
WebratWorld.new
end[/code]

A nie możesz wystubować tego logowania? OAuth chyba nie trzeba testować? :slight_smile:

Np. jak blip padnie to nie bedziesz mógł odpalić testów? Albo jak nie będziesz miał internetu.

W sumie masz rację sevos. Callbacki odpalane przy okazji tworzenia usera chyba też nie wymagają testów :wink: Jutro się tym zajmę, przetestuję jeszcze rozwiązanie GhandaLa.

Są gdzieś na sieci tutoriale o stubowaniu API twittera + oauth z użyciem FakeWeb. Nie mam czasu teraz szukać, ale google coś pewnie o tym wie :wink:

Po wklejeniu kodu podanego przez GhandaLa wszystko działa, ale zajmę się jednak stubowaniem. Dzięki.

To ja może napiszę kilka zdań, żeby wyjaśnić o co chodzi z tym kodem.

Domyślnie webrat ma ustawiony mode :rails, co mówiąc w prostych słowach jest nakładką na railsowe testy integracyjne. Jest to więc proste get/post/put/delete ubrane w ładne API. Webrat wysyła np. get ‘/’, dostaje odpowiedź, dostaje np. click_link ‘Login’, więc parsuje tą odpowiedź i znajduje linka. Dlatego nie da się tam łatwo podpiąć obsługi javascritptu/css i z tego samego powodu nie można odwiedzić żadnej innej strony. Ma to też swoje plusy - jak railsy rzucają wyjątkiem, to od razu widać co to za wyjątek (pod selenium/mechanize czy celerity [to już bez webrata oczywiście] nie jest już tak prosto).

Jako, że webrat sprawdził się bardzo dobrze jako API, to powstało kilka dodatkowych trybów pracy, między innymi mechanize i selenium, w których można otwierać dowolne adresy.

Drogomir, więcej takich postów. Najchętniej bym go wykopał. :slight_smile:

Tak swoją drogą, to zupełnie zapomniałem o tym, że plugin OAuth do Authlogica nie blokuje przecież możliwości normalnej rejestracji.

Cóż, muszę ponownie poprosić o pomoc.

Owszem, nie trzeba, jednak mam problem z utworzeniem sesji użytkownika. Gdziekolwiek nie zajrzę, to proponują rozwiązane w takim stylu:

Given /^"(.*)" a logged in user$/ do |name| Given "\"#{name}\" a confirmed user" When "I fill in \"login\" with \"hector\"" And "I fill in \"password\" with \"secret\"" And "I press \"Login\"" Then "I should see my account page" end

Jednak ja korzystam z authlogic_oauth i w widokach mam jedynie rejestrację/logowanie tylko przez OAuth. Do tej pory korzystałem z trochę “niechlujnej” metody:

[code “ruby”]
Given /^I am logged in as “([^\”]*)"$/ do |username|

if User.find_by_username(username)
post ‘/user_sessions’, :user_session => {:username => username, :password => “lolz#{username}”}
else
post ‘/users’, :user => {:username => username, :password => “lolz#{username}”, :password_confirmation => “lolz#{username}”}
end

end[/code]

I to działało. Jednak kiedy utworzyłem zupełnie nowy projekt, to dziwnym trafem działać nie chce - krok związany z zalogowaniem (Given I am logged…) przechodzi, ale po nim sesja i tak nie jest tworzona. Myślałem, że to problem z działaniem gemu, ale napisałem inny test, dodałem nowy formularz (username, password, password_confirmation - ogólnie do rejestracji, po której tworzona jest też sesja) i wtedy wszystko elegancko działało.

Później jeszcze wpadłem na to, że może być to problem z Capybarą, ale po użyciu Webrata (jak w poprzednim projekcie) błąd nadal występuje.

Jakieś pomysły, jak temu zaradzić?