1

如何访问应用程序实例以便测试 foobar() 方法?

class App < Sinatra::Base
  get '/' do
    return foobar
  end

  def foobar
    "hello world"
  end
end
4

2 回答 2

1

这是一个迟到的回复,但我也在努力寻找一种灵活的方式来做到这一点。

我在 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 方法(通常在应用程序中)与所有帮助程序等分开。帮助程序最终在一个单独的文件中更清洁、更易于维护和更易于测试。但我绝对理解应用程序的第一个版本将包含一些帮助程序的情况,并意识到重构是必要的。即便如此,进行测试也会让人们对软件本身以及未来的重构更有信心。

于 2014-07-31T05:54:33.567 回答
0

你测试什么并不重要 - 它是如何:) => http://www.sinatrarb.com/testing.html

于 2012-11-21T14:44:36.337 回答