如何访问应用程序实例以便测试 foobar() 方法?
class App < Sinatra::Base
get '/' do
return foobar
end
def foobar
"hello world"
end
end
这是一个迟到的回复,但我也在努力寻找一种灵活的方式来做到这一点。
我在 Sinatra 的源代码 (1.4.5) 中发现创建应用程序实例new!
允许直接测试应用程序的方法。使用 Test::Unit 和 Shoulda 从测试设置中发挥作用。
class AppTest < Test::Unit::TestCase
setup do
@app = App.new! # here is the point.
end
should 'say hello to the world' do
assert_equal "hello world", @app.foobar # or @app.send(:foobar) for private methods.
end
end
有后果。使用new!
不会创建Sinatra::Wrapper
成为中间件管道和正常设置中的应用程序入口点的常规。因此,new!
只有当被测试的方法是真正不依赖中间件功能(例如 SSL)的“助手”时,该方法才有效。
或者,Rspec 上的一篇文章提出了另一种解决方案。我过去使用过类似的东西,但它需要更多的工作,这并不总是最好的选择。它的优势在于提供更广泛的代码覆盖范围以进行测试。new!
如果我们正在进行“单元”测试,那么将应用程序与应用程序隔离听起来不错。
注意@three 的评论:一个重要的应用程序应该将 API 方法(通常在应用程序中)与所有帮助程序等分开。帮助程序最终在一个单独的文件中更清洁、更易于维护和更易于测试。但我绝对理解应用程序的第一个版本将包含一些帮助程序的情况,并意识到重构是必要的。即便如此,进行测试也会让人们对软件本身以及未来的重构更有信心。
你测试什么并不重要 - 它是如何:) => http://www.sinatrarb.com/testing.html