我有一个 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 会执行以下操作:
- 将请求添加到最近的请求列表中
- 创建您的应用程序的新实例并调用其
call
方法 - 将您的应用程序的响应添加到最近响应列表
访问 last_request
和 last_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/