ruby - 使用 Rack::Test 和 Sinatra 测试 Controller 实例变量

标签 ruby testing sinatra rack

我有一个 Sinatra 应用程序,它根据用户是否登录以只读或可编辑的方式提供页面。

Controller 设置一个变量@can_edit, View 使用它来隐藏/显示编辑链接。我如何在测试中测试 @can_edit 的值?我不知道如何在 Rack::Test 下获取 Controller 的当前实例。

我使用 class_eval 来 stub Controller 中的 logged_in? 方法,但我不得不求助于检查 last_response.body我的编辑链接以查看是否设置了 @can_edit

如何直接测试@can_edit的值?

最佳答案

不幸的是,如果不修改 Rack::Test,我认为这是不可能的。当您在应用程序测试期间发出请求时,Rack::Test 会执行以下操作:

  1. 将请求添加到最近的请求列表中
  2. 创建您的应用程序的新实例并调用其call 方法
  3. 将您的应用程序的响应添加到最近响应列表

访问 last_requestlast_response 很容易,但不幸的是,在应用程序运行时不会保存有关应用程序状态的信息。

如果您有兴趣一起破解 Rack::Test 补丁来执行此操作,请先查看第 30 行的 rack-test/lib/rack/mock_session.rb。这是哪里Rack::Test 运行您的应用程序并接收标准的 Rack 应用程序返回值(状态、标题、正文)。我的猜测是您还必须修改您的应用程序,以收集它的所有实例变量并使其可供访问。

无论如何,最好是测试结果,而不是实现细节。如果您想确保编辑链接不可见,请通过 DOM id 测试编辑链接是否存在:

assert last_response.body.match(/<a href="..." id="...">/)

关于ruby - 使用 Rack::Test 和 Sinatra 测试 Controller 实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1928968/

相关文章:

ruby-on-rails - database.yml 的 Ruby 和 Rails yaml 解析器错误

.net - 为 Windows Forms .NET 寻找一些好的 GUI 测试框架/GUI 自动化测试工具

javascript - Twitter Bootstrap - 通过单击链接显示模态

ruby - 使用 nginx 在 Phusion Passenger 上工作时 Sequel DB 连接的正确位置

ruby-on-rails - 在 Rails 中创建一个简单的计数器

ruby-on-rails - 如何从用户数组中提取电子邮件

javascript - 单元测试 View - 最佳实践

web-services - 用于使用 webServices 的 Curl 命令行?

Ruby Sinatra 创建发布请求

ruby-on-rails - "unexpected end-of-input, expecting keyword_end (SyntaxError)"RSpec 3、Rails 4.1.6、Ruby 2.0