- 1、本文档共59页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
rails敏捷开发《3》.doc
14.4 应用程序的集成测试
Integration Testing of Applications
下一个层面的测试是要验证应用程序的工作流程。在某种意义上,这就是在测试客户交给我们的用户故事——我们正是根据这些故事来开发应用程序的。譬如说,有这样一个故事:“用户进入商店首页。用户选择一件货品,将其放入购物车。用户结账,在表单中填入详细信息。用户提交表单之后,数据库中创建一份订单,其中包含用户详细信息,以及与购物车中所有货品对应的订单项。”
这正是集成测试的理想材料。集成测试需要模拟一个或多个虚拟用户与应用程序之间的一组连续的会话,你可以在其中发送请求、监控应答、跟踪重定向,等等。
当创建模型,控制器的同时,Rails就会创建对应的单元测试/功能测试。集成测试却不是自动创建的,你需要自己动手来创建它们。
depot> ruby script/generate integration_test user_stories
exists test/integration/
create test/integration/user_stories_test.rb
可以看到,Rails自动地给测试文件的名称加上了_test后缀。
现在来看看这个生成的文件。
require "#{File.dirname(__FILE__)}/../test_helper"
class UserStoriesTest < ActionController::IntegrationTest
# fixtures :your, :models
# Replace this with your real tests.
def test_truth
assert true
end
end
看起来有些像功能测试,不过测试类继承了IntegrationTest类。
下面就来动手编写针对上述故事的测试。由于在故事中要购买一些东西,所以需要用到products夹具,因此,我们在测试类的开始处就将其加载进来。
fixtures :products
跟单元测试和功能测试一样,这里的测试方法名也应该以test一开头。
def test_buying_a_product
# ...
end
当测试结束时,我们期望orders表中新增一份订单数据、line_items表中新增了一份订单项数据,因此在测试开始之前应首先将它们清除掉。另外,由于会经常使用ruby_book这项夹具数据,我们首先将它放入一个局部变量中。
depot_r/test/integration/user_stories_test.rb
LineItem.delete_all
Order.delete_all
ruby_book = products(:ruby_book)
我们先来搞定用户故事中的第一句话:“用户进入商店首页”。
depot_r/test/integration/user_stories_test.rb
get "/store/index"
assert_response :success
assert_template "index"
这看上去跟功能测试差不多,最大的区别在于get方法:在功能测试中,我们只测试一个控制器,因此在调用get()方法时只须指定action而在集成测试中,我们会穿梭于整个应用程序,所以需要传入完整的(相对)URL路径,其中包括控制器和action。
故事中的第二句话是“用户选择一件货品,将其放入购物车”。我们的应用程序使用Ajax请求来将物品放入购物车,因此调用这个action时应该使用xml_http_request方法。该方法返回之后,我们再检查购物车中是否已经包含所请求的货品。
depot_r/test/integration/user_stories_test.rb
xml_http_request "/store/add_to_cart" , :id => ruby_book.id
assert_response :success
cart = session[:cart]
assert_equal 1, cart.items.size
assert_equal ruby_book, cart.items[0].product
话锋一转,用户故事的第三句话说“用户结账……”。这很容易测试
depot_r/test/integration/user_stories_test.rb
post "/store/checkout"
assert_response :success
assert_template "checkout"
此刻,用户需要在结账表单中填入详细信息。在他们提交表单之后,应用程序会创建一份订单,并将用户重定向
文档评论(0)