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但是真正测试还不止这些后面我们再学习些进阶内容
最新评论