我有一个Sinatra应用程序,它以只读或可编辑的方式提供页面,具体取决于用户是否已登录.
控制器设置变量@can_edit,视图使用该变量来隐藏/显示编辑链接.如何在测试中测试@ can_edit的值?我不知道如何在Rack :: Test下获取控制器的当前实例.
我使用class_eval来存根logged_in?控制器中的方法,但我不得不求助于检查last_response.body以查看我的编辑链接,看看是否已设置@can_edit.
如何直接测试@can_edit的值?
解决方法
不幸的是,如果不修改Rack :: Test,我认为这是不可能的.在应用程序测试期间发出请求时,Rack :: Test会执行以下操作:
>将请求添加到最近请求列表中
>创建应用程序的新实例并调用其调用方法
>将您的应用程序的响应添加到最近的响应列表中
访问last_request和last_response很容易,但遗憾的是,在应用程序运行时没有保存有关应用程序状态的信息.
如果您有兴趣将Rack :: Test补丁一起打到这里,请先查看第30行的rack-test / lib / rack / mock_session.rb.这是Rack :: Test运行您的应用程序并接收标准机架应用程序返回值(状态,标题,正文).我的猜测是,您还必须修改您的应用程序,以收集并使其所有实例变量可访问.
无论如何,最好测试结果,而不是实现细节.如果要确保编辑链接不可见,请按DOM ID测试是否存在编辑链接:
assert last_response.body.match(/<a href="..." id="...">/)