2009-05-30 5 views
2

Как отправить cookie в функциональный тест? Как проверить, чтобы файл cookie был очищен?Проверка очистки значений cookie в Rails?

У меня был большой успех с использованием TDD для создания моделей для приложения Rails, но они попали в заблуждение относительно тестирования контроллера: я могу установить значения cookie один раз в тесте и прочитать их, но я не могу очистите их. То есть:

test "clears cookie" do 
    get :set_it, :stuff => {'key' => 'value'} # stuff to cookify 
    assert cookies['key'] == 'value' # works fine 

    get :clear_it # cookie doesn't get sent. How do I simulate this? 
    assert nil == cookies['key'], 'Cookie not cleared' # fails 
end 

Рельсы тестирования руководство не говоря уже о том, чтобы имитировать отправку печенья в тесте, просто, как проверить, что данные были установлены на сервере. Я знаю, что я столкнулся с ситуацией, прежде чем данные cookie не будут изменены на сервере, пока не будет отправлен ответ. Это то, что здесь происходит? Я бы очень надеялся, что функциональные тесты сделали бы лучшую работу «быть клиентом».

Это широко известная проблема? Люди просто уходят в отставку от использования JUnit для такого рода вещей? Мне очень понравилось бы использовать один фрейм для всех или почти всех моего tdd.


Sheer Отчаяние и догадки привели меня к оптимистический попробовать @ Response.Cookies, но это не сработало.

+0

Обратите внимание, что ручное тестирование - печать файлов cookie в файле * .html.erb - показывает, что файлы cookie действительно очищаются. Почему это не может работать? !! – Mike

ответ

1

Мой выход из тест был

assert_nil @response.cookies["auth_token"] 

, который работает.

Какую ценность вы получаете, если не ноль?

+0

Я попытался использовать этот тест, но проблема в том, что он не сработает, если я не удалю файл cookie. – Tobias

2

Если вы хотите иметь единичный тест, специфичный для снятия cookie-файла, то вы на самом деле проверяете, содержит ли ответ заголовок, который не содержит cookie. Я предполагаю, что ваш get :clear_it делает cookies.delete :cookie-name. Это устанавливает response.header, чтобы он содержал Set-[COOKIE-NAME]=;. Поэтому, если другие методы не работают, вы можете просто искать эту строку напрямую.

Что выглядит подозрительно в вашем коде, так это то, что вы просто проверяете cookies напрямую. Где ответ идет от вашего запроса «получить»?

Если все остальное, если не удается, вы также можете использовать интеграционные тесты с webrat, как обсуждалось here. Это может быть не так хорошо, как модульное тестирование, но, по крайней мере, проверяет функциональность.

+0

Это лучший ответ, который я встретил во время моего поиска, он определенно будет признанным. –