使用Rack :: Test和Sinatra测试控制器实例变量

Bri*_*ian 8 ruby testing rack sinatra

我有一个Sinatra应用程序,它以只读或可编辑的方式提供页面,具体取决于用户是否已登录.

控制器设置一个变量@can_edit,视图使用该变量来隐藏/显示编辑链接.我怎样才能@can_edit在测试中测试它的价值?我不知道如何在Rack :: Test下获取控制器的当前实例.

我用来在控制器中class_eval存根logged_in?方法,但是我不得不求助于检查last_response.body我的编辑链接以查看是否@can_edit已经设置.

我该如何@can_edit直接测试其值?

Ale*_*ner 8

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

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

这很容易访问last_requestlast_response,但不幸的是,而它的运行没有任何信息保存了您的应用程序的状态.

如果你有兴趣将Rack :: Test修补程序拼凑在一起,请先查看rack-test/lib/rack/mock_session.rb第30行.这是Rack :: Test运行你的应用程序并获得标准Rack app返回值的地方(状态,标题,正文) ).我的猜测是,您还必须修改您的应用程序,以收集并使其所有实例变量可访问.

无论如何,最好测试结果,而不是实现细节.如果要确保编辑链接不可见,请按DOM ID测试是否存在编辑链接:

assert last_response.body.match(/<a href="..." id="...">/)
Run Code Online (Sandbox Code Playgroud)