【问题标题】:Need a push in the right direction, to write my first functional test in Rails需要朝着正确的方向努力,在 Rails 中编写我的第一个功能测试
【发布时间】:2010-05-19 03:27:18
【问题描述】:

在过去的几天里,我安静地阅读了一些关于在 Rails 中进行测试的文档,我正在坐下来编写我的第一个真正的测试,但不确定如何将我学到的知识结合在一起以实现以下目标功能测试(测试控制器)

我需要向 URL 发送 GET 请求并传递 3 个参数(简单的 Web 服务),如果功能有效,则简单地返回关键字 true,否则返回关键字 false - 它的唯一值返回且未包含在任何<div><span> 或其他标签中。

测试应该断言如果返回“true”则测试成功。

这可能很简单,所以对于这样一个没有挑战性的问题,我们深表歉意。

如果有人能指出我如何开始的写作方向,特别是如何测试回复,我将不胜感激!

【问题讨论】:

    标签: ruby-on-rails automated-tests functional-testing


    【解决方案1】:

    你读过A Guide to Testing Rails Applications吗?挺好的。

    您的测试可能看起来像:

    def test_should_get_index
      get :index, :a => "1", :b => "2", :c => "3"
      assert_response :success
      assert_equal "true", @response.body
    end
    

    【讨论】:

    • 谢谢约翰,我确实有——正如你所说,它非常好。我不知道如何测试响应的主体......此时正在撞墙。大多数示例处理解析标签。
    【解决方案2】:

    如果它是对您自己的应用程序的测试,则可以根据您的喜好将此类测试作为功能测试或集成测试来完成。集成测试更“真实”,因为它们使用真实的 URL 和路由,不像功能测试只是执行特定的控制器操作。

    对于外部服务,您真正需要的是使用 Test::Unit 或其他框架(如 rspec 或 Cucumber)作为测试定义的包装器。

    在某种类中定义发出这个 GET 请求的方法,然后编写一个测试它的工具。例如:

    def test_expected_response
      assert_equal 'true', MyHelper.make_call('param_a', 'param_b', 'param_c')
    end
    

    显然,除非正确定义 MyHelper 和 MyHelper.make_call,否则此测试将失败,但这并不太难:

    class MyHelper
      def make_call(a, b, c)
        # Call service using Net::HTTP, Curb, etc.
        # ...
        # Return answer
      end
    end
    

    【讨论】:

    • 感谢 Tadman,我喜欢类/线束模型,非常可扩展!只是想知道将 MyHelper 类放在 Rails 目录结构中的什么位置(作为放置这些测试类的最佳实践位置),在 lib 中?
    • 如果放在app/models中,在开发环境中会自动重新加载,可以简化调试。如果你把它们放在 lib 中,它们就不会弄乱你的模型目录。两者都应该工作。
    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    相关资源
    最近更新 更多