快速业务通道

Ruby on rails开发从头来(windows)(二十五)-测试Controller - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14

Ruby on rails开发从头来(windows)(二十五)-测试Controller

时间:2011-12-02 博客园 Cure

这次我们继续测试Controller,还是Store_controller。

1.先来测试测试CheckOut功能,给store_controller_test.rb添加代码:

def test_checkout
test_add_to_cart
get :checkout
assert_response :success
assert_not_nil assigns(:order)
assert_template "store/checkout"
end

注意这里调用了另一个test方法test_add_to_cart,因为如果购物车为空的话,我们将无法转到预想的checkout页面去,所以我们必须让购物车(cart)里至少有一件商品(item)。所以我们没有写重复代码,而是调用了test_add_to_cart方法来使购物车中有商品。

2.再来测试保存订单功能,我们通过save_order的Action来将保存order,我们的办法就是:cart将items存放到order的model里,然后由order保存到数据库,然后将cart置空,再重新定位到购物的store页面,并且显示一个友好的消息。现在在store_controller_test.rb添加代码:

def test_save_invalid_order
test_add_to_cart
post :save_order, :order => {:name => ''fred'', :email => nil}
assert_response :success
assert_template "store/checkout"
assert_tag :tag => "div", :attributes => { :class => "fieldWithErrors" }
assert_equal 1, session[:cart].items.size
end

上面是先测试无效的order,我们通过给save_order的Action一个无效的order,当无效的order被提交的时候,我们使用assert_tag来检查响应的div节点的是否是fieldWithErrors类型。

3.下面我们再来测试一个有效的order的保存。

def test_save_valid_order
test_add_to_cart
assert_equal 1, session[:cart].items.size
assert_equal 1, Order.count
post :save_order, :order => @valid_order_for_fred.attributes
assert_redirected_to :action => ''index''
assert_equal "Thank you for your order.", flash[:notice]
follow_redirect
assert_template "store/index"
assert_equal 0, session[:cart].items.size
assert_equal 2, Order.find_all.size
end

Ruby on rails开发从头来(windows)(二十五)-测试Controller(2)

时间:2011-12-02 博客园 Cure

运行测试,提示有断言失败,仔细看看,原来是assert_equal 1, Order.count这一句,是因为我们还没有边界order的fixtrue,现在转到fixtrues目录下,修改orders.yml文件:

valid_order_for_fred:

id: 1

name: Fred

email: fred@flintstones.com

address: 123 Rockpile Circle

pay_type: check

再运行测试,这次提示的错误(error),原来是@valid_order_for_fred.attributes的问题,这是老问题了,为了不影响我们继续,在test_add_to_cart后面添加一句,@valid_order_for_fred = Order.find(1),OK,再次运行测试,还有错误!看看命令行的输出:

-------------------------------------------------

1) Failure:

test_save_valid_order(StoreControllerTest) [test/functional/store_controller_test.rb:75]:

<"Thank you for your order."> expected but was

<"Thank you for your order">.

6 tests, 32 assertions, 1 failures, 0 errors

_________________________________________________

看来是flash中设置的文本有问题,少了一个句号,我们回过头,修改store_controller.rb中的save_order方法,给flash的文本后面添加一个句号,然后再执行测试,OK,这次全部通过了。

4.如果我们现在回到数据库里看看order表,会发现有两条一模一样的记录,仅仅是id不同而已。这是因为测试在执行时,加载order的测试fixtrue时向数据库中添加了一跳id为1的order,然后我们在执行save_valid_order时又向其中添加了一条order。我们可以通过查看Log目录下的test.log文件来查看Action的调用情况和执行的sql的情况。

自己通过查看log,只发现了测试用例调用save_order的Action的一次Insert操作,但是虽然直觉上order的fixtrue加载时也应该有log,但是并没有找到。

好了,目前我们写了一些简单的测试,包括Model的,Controller的,但是真正的测试还不止这些,后面我们再学习一些进阶内容。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号