【问题标题】:Testing the clearing of cookie values in Rails?在 Rails 中测试清除 cookie 值?
【发布时间】:2020-07-09 18:49:56
【问题描述】:

如何在功能测试中发送 cookie?如何测试以确保清除 cookie?

我在使用 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

rails 测试指南没有提到如何在测试中模拟 cookie 的发送,只是如何验证数据是否设置在服务器上。我知道我之前遇到过这样一种情况,即在发送响应之前,服务器上的 cookie 数据不会被更改。这就是这里发生的事情吗?我有点希望功能测试在“成为客户”方面做得更好。

这是一个广为人知的问题吗?人们只是放弃使用 JUnit 来做这种事情吗?我真的很想能够为我的全部或几乎全部 tdd 使用一个框架。


纯粹的绝望和猜测让我乐观地尝试了@response.cookies,但这也没有用。

【问题讨论】:

  • 请注意,手动测试——将 cookie 打印到 *.html.erb 文件中——表明 cookie 确实被清除了。为什么这行不通?!!

标签: ruby-on-rails cookies tdd


【解决方案1】:

如果您想专门针对取消设置 cookie 进行单元测试,那么您实际上是在测试响应是否包含将 cookie 设置为空的标头。我假设你的get :clear_it 正在做cookies.delete :cookie-name 。这会将 response.header 设置为包含 Set-[COOKIE-NAME]=;。因此,如果其他方法失败,您可以直接查找该字符串。

在您的代码中看起来可疑的是您只是直接检查cookies。您的“获取”请求的响应来自哪里?

如果一切都失败了,您还可以使用 webrat 的集成测试,如 here 所讨论的那样。这可能不如单元测试那么好,但它至少会检查功能。

【讨论】:

  • 这是我在搜索过程中遇到的最佳答案,它绝对应该是公认的。
【解决方案2】:

我的注销测试有

assert_nil @response.cookies["auth_token"]

哪个有效。

如果不是 nil,你会得到什么价值?

【讨论】:

  • 我尝试使用这个测试,但问题是如果我不删除cookie它不会失败。
猜你喜欢
  • 2011-07-03
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 2011-04-04
相关资源
最近更新 更多