rubyonrails:Ruby on rails开发从头来(windows)( 2十 5)-测试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我们办法就是:cart将items存放到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 => { : => "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@flstones.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为1order,然后我们在执行save_valid_order时又向其中添加了条order我们可以通过查看Log目录下test.log文件来查看Action情况和执行sql情况

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

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

Tags:  rubyonrails安装 rubyforrails rubyrails rubyonrails

延伸阅读

最新评论

发表评论