[英]Testing controller instance variables with Rack::Test and Sinatra
我有一个Sinatra应用程序,它以只读或可编辑的方式提供页面,具体取决于用户是否已登录。
控制器设置变量@can_edit
,视图使用该变量来隐藏/显示编辑链接。 如何在测试中测试@can_edit
的值? 我不知道如何在Rack :: Test下获取控制器的当前实例。
我使用class_eval
来存根logged_in?
控制器中的方法,但是我不得不求助于检查last_response.body
以获取我的编辑链接,看看是否已经设置了@can_edit
。
如何直接测试@can_edit
的值?
不幸的是,如果不修改Rack :: Test,我认为这是不可能的。 当您在应用程序测试期间提出请求时,Rack :: Test会执行以下操作:
call
方法 访问last_request
和last_response
很容易,但遗憾的是,在应用程序运行时没有保存有关应用程序状态的信息。
如果你有兴趣将Rack :: Test补丁一起rack-test/lib/rack/mock_session.rb
这里, rack-test/lib/rack/mock_session.rb
查看第30行的rack-test/lib/rack/mock_session.rb
。这是Rack :: Test运行你的应用程序并接收标准机架应用程序返回值(状态,标题,正文)。 我的猜测是,您还必须修改您的应用程序,以收集并使其所有实例变量可访问。
无论如何,最好测试结果,而不是实现细节。 如果要确保编辑链接不可见,请按DOM ID测试是否存在编辑链接:
assert last_response.body.match(/<a href="..." id="...">/)
有点黑客可能。 Sinatra应用程序的实例不可用,因为它们是在调用Sinatra :: Base#调用时创建的。 正如Alex解释的那样 这个hack准备一个实例,让下一个调用抓住它。
require 'something/to/be/required'
class Sinatra::Base
@@prepared = nil
def self.onion_core
onion = prototype
loop do
onion = onion.instance_variable_get('@app')
return onion if onion.class == self || onion.nil?
end
end
def self.prepare_instance
@@prepared = onion_core
end
# Override
def call(env)
d = @@prepared || dup
@@prepared = nil
d.call!(env)
end
end
describe 'An Sinatra app' do
include Rack::Test::Methods
def app
Sinatra::Application
end
it 'prepares an app instance on ahead' do
app_instance = app.prepare_instance
get '/foo'
app_instance.instance_variable_get('@can_edit').should be_true
end
end
这是一个讨厌但可行的选择
# app.rb - sets an instance variable for all routes
before do
@foo = 'bar'
end
# spec.rb
it 'sets an instance variable via before filter' do
my_app = MySinatraApplication
expected_value = nil
# define a fake route
my_app.get '/before-filter-test' do
# as previously stated, Sinatra app instance isn't avaiable until #call is performed
expected_value = @foo
end
my_app.new.call({
'REQUEST_METHOD' => 'GET',
'PATH_INFO' => '/before-filter-test',
'rack.input' => StringIO.new
})
expect(expected_value).to eq('bar')
end
这允许您在过滤之前测试sinatra,或者访问为基本应用程序创建的实例变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.