zoukankan      html  css  js  c++  java
  • Ruby on rails开发从头来(windows)(二十五)测试Controller

    这次我们继续测试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_orderAction来将保存order,我们的办法就是:cartitems存放到ordermodel里,然后由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_orderAction一个无效的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

    运行测试,提示有断言失败,仔细看看,原来是assert_equal 1, Order.count这一句,是因为我们还没有边界orderfixtrue,现在转到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时向数据库中添加了一跳id1order,然后我们在执行save_valid_order时又向其中添加了一条order。我们可以通过查看Log目录下的test.log文件来查看Action的调用情况和执行的sql的情况。

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

     

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

  • 相关阅读:
    HDU 5213 分块 容斥
    HDU 2298 三分
    HDU 5144 三分
    HDU 5145 分块 莫队
    HDU 3938 并查集
    HDU 3926 并查集 图同构简单判断 STL
    POJ 2431 优先队列
    HDU 1811 拓扑排序 并查集
    HDU 2685 GCD推导
    HDU 4496 并查集 逆向思维
  • 原文地址:https://www.cnblogs.com/dahuzizyd/p/ruby_rails_dotnet_study_25.html
Copyright © 2011-2022 走看看