Rspec, testowanie potwierdzenia dodania ogłoszenia

Pierwsze pytanie, czy macie mi za złe, że dość często pytam czy mój poniższy działający kod można jakoś poprawić? :slight_smile: Bo mam znowu takie pytanie :stuck_out_tongue:

Poza tym zastanawiam się jak podejść do testowania tej części mojej aplikacji? Testy modelu oraz testy akceptacyjne mam już napisane. Zamieszczam poniżej. Może macie jakieś uwagi i podrzucicie jakieś linki gdzie szukać i jeszcze więcej się uczyć na ten temat :stuck_out_tongue: To moje pierwsze testy :slight_smile: Może macie propozycje jakichś scenariuszy które powinienem przy tego typu aplikacji wziąć pod uwagę?

[code=ruby]#routes.rb
resources :ads do
member do
get ‘confirm’
end
end
match ‘:controller/:action/:id/:token’

#ads_controller.rb
def create
@ad = Ad.new(params[:ad])
if @ad.save
AdMailer.ad_token(@ad).deliver
redirect_to root_path
flash[:notice_item] = “Ogłoszenie przekazane do weryfikacji.”
else
render :action => “new”
end
end

def confirm
@ad = Ad.find(params[:id])
@advertiser = Advertiser.find_or_create_by_email(
:email => @ad.email,
:name => @ad.name,
:phone_number => @ad.phone_number
)
if @ad.token == params[:token]
@ad.email_id = @advertiser.id
@ad.save
flash[:notice_item] = “potwierdzono”
else
flash[:notice_item] = “błędny kod potwierdzający”
end
redirect_to root_path
end[/code]

describe "Tokens" do it "emails user with token when he creates ad" do visit new_ad_path fill_in "ad_title", :with => "fsdfsd" fill_in "ad_ad_content", :with => "fsdfsd" fill_in "ad_price", :with => "5,33" fill_in "ad_name", :with => "fsfdsk" fill_in "ad_email", :with =>"d@d.pl" fill_in "ad_phone_number", :with => "662284020" click_button 'Dodaj ogłoszenie' # save_and_open_page current_path.should eql(root_path) last_email.to.should include("d@d.pl") end end

Taki funkcjonalny będzie szybszy i przetestuje dokładnie to co chcesz (redirect, utworzenie ogłoszenia i wysłanie maila).

it "should email user with token" do lambda { post :create, :ad => { :title => "asdf", :ad_content => "asdfasdf", ... } response.should redirect_to(root_path) AdMailer.last.email.should eql("d@d.pl") }.should change(Ad, :count).by(1) end