2011-06-27 10 views
13

Istnieje wiele nieporozumień na temat ustawiania cookies w rspec http://relishapp.com/rspec/rspec-rails/v/2-6/dir/controller-specs/file/cookiesJak przetestować cookies wygaśnięcia szynach rspec

w kontrolerze, normalnie można napisać

cookies['transaction_code'] = { :expires => 300.seconds.from_now, :value => c } 

ale w RSpec mogę tylko Napisać

request.cookies['transaction_code'] = transaction_code 

jeśli powiem

request.cookies['transaction_code'] = { :expires => 300.seconds.from_now, :value => c } 

Otrzymuję skrót z powrotem jako wartość plików cookie ["kod_pryw."] W moim kontrolerze.

Teraz moje pytanie brzmi: jak ustawić/przetestować wygasanie ciasteczek, a następnie w przykładzie testowym kontrolera rspec?

AKTUALIZACJA: W sekundach myślałem: Chodzi mi o to, jak mogę sprawdzić, czy kontroler reaguje na wygasły plik cookie zgodnie z oczekiwaniami, ale w rzeczywistości wygasły plik cookie jest jak brak ciasteczka, jeśli ufam wdrażaniu plików cookie, co powinien zrobić, więc w końcu moje pytanie nie ma sensu. W takim przypadku muszę sprawdzić, czy (inna) akcja kontrolera poprawnie ustawia wygasający plik cookie, ale jak to zrobić, jeśli pliki cookie ["kod_prowadzenia"] w teście tylko zwracają wartość?

Odpowiedz

17

Przeglądarki do not send cookie attributes back to the server. Dlatego możesz wysłać tylko parę klucz-wartość do działania.

Ponieważ można założyć, że Railsy, ​​Rack i przeglądarki działają prawidłowo z argumentami, wszystko, co naprawdę trzeba przetestować, to argumenty przekazywane przez kod do CookieJar.

Aby sprawdzić, czy termin wygaśnięcia jest ustawiony prawidłowo w ustawieniach kontrolera cookie, możesz wykasować metodę #cookies i upewnić się, że są do niej przekazywane właściwe ustawienia.

# app/controllers/widget_controller.rb 
... 
def index 
    cookies[:expiring_cookie] = { :value => 'All that we see or seem...', 
            :expires => 1.hour.from_now } 
end 
... 

# spec/controllers/widget_controller_spec.rb 
... 
it "sets the cookie" do 
    get :index 
    response.cookies['expiring_cookie'].should eq('All that we see or seem...') 
               # is but a dream within a dream. 
               #    - Edgar Allan Poe 
end 

it "sets the cookie expiration" do 
    stub_cookie_jar = HashWithIndifferentAccess.new 
    controller.stub(:cookies) { stub_cookie_jar } 

    get :index 
    expiring_cookie = stub_cookie_jar['expiring_cookie'] 
    expiring_cookie[:expires].to_i.should be_within(1).of(1.hour.from_now.to_i) 
end 
... 

Testowanie o wiele więcej niż gotowanie oceanu. W pewnym momencie musisz założyć, że stos, na którym siedzisz (np. Rails, Rack, serwer WWW, TCP/IP, system operacyjny, przeglądarki internetowe itp.) Działa poprawnie i skupia się na kodzie, który kontrolujesz.

+0

nice one kro, akceptuję twoją odpowiedź, nie jestem pewien o stubbecie cookiestore, wspominając o oczywistym Dostęp do słoika z ciasteczkami jest obojętny na użycie symboli lub łańcuchów jako kluczy w przeciwieństwie do twojego hasha. Ogólnie rzecz biorąc, czuję się nieswojo, ponieważ jest to część struktury. Ponadto, jest coś takiego jak expiring_cookie [: expires] .to_i.should be_within (1) .of (1.hour.from_now.nowi) najlepsza praktyka do testowania dynamicznych ustawień czasu? –

+0

Nie, prawdopodobnie zrobiłbym coś innego z Matcherem dla 'DateTime' w rzeczywistej specyfikacji. Moim celem było dostarczenie czegoś, co przejdzie jako ilustracja, ponieważ '==' nie będzie. – krohrbaugh

+0

Co do twojego obojętnego problemu z dostępem; można to łatwo naprawić, używając 'ActiveSupport :: HashWithIndifferentAccess' zamiast stdlib' Hash'. Zaktualizowałem przykładowy kod, aby to odzwierciedlić. – krohrbaugh

0

Inną opcją korzystania Timecop:

Timecop.freeze(Time.now) 

expect(controller.send(:cookies)).to receive(:[]=).with('cookie_name', 
    value: 'whatever', 
    expires: 1.hour.from_now 
) 

get :index 
0

Przyjechałem z przyszłości z tym:

it 'sets the cookie expiration' do 
    stub_cookie_jar = HashWithIndifferentAccess.new 
    allow(controller).to receive(:cookies).and_return(stub_cookie_jar) 
    get :index 
    expiracy_date = stub_cookie_jar[:expires] 
    expect(expiracy_date).to be_between(1.hour.from_now - 1.minutes, 
             1.hour.from_now) 
    end 
Powiązane problemy