测试 使用 RSpec+Capybara 简单 BDD 入门 -11

blueplanet · 发布于 2013年1月05日 · 最后由 ringokun 回复于 2016年12月19日 · 2589 次阅读
2650

目录:http://ruby-china.org/topics/7770 上一步:使用 RSpec+Capybara 简单BDD入门 -10

用户故事

用户希望对帖子进行回复

环境准备

git checkout -b f11
rails c # console
rails s # server

步骤

编辑spec/features/guest_can_see_topic_info_spec.rb,增加回复form的验证部分

scenario '应该显示回复用的form' do
  visit "/topics/#{@topic.id}"

  page.should have_field 'reply_content'
  page.should have_button '提交回复'
end
  • 测试失败:expected to find field "replay_content" but there were no matches
  • 原因:没有实现的代码

编辑topics/show.html.haml

拷贝ui/topic.html中回复form的部分至当前模板

%section#reply.box
  %form(action="" method="post")
    %textarea(rows="4")
    %input(type="submit" class="btn btn-primary" value="提交回复")

修改为

%section#reply.box
  = form_for [@topic, Reply.new] do |f|
    = f.text_area :content, rows: 4
    = f.submit "提交回复", class: "btn btn-primary"
  • 测试失败:undefined methodtopic_replies_path' for #<#<Class:0x007fc0f8`
  • 原因:没有设置路由信息

编辑config/routes.rb,增加嵌套的replay的路由设置

resources :topics, only: [:index, :show, :new, :create] do
  resources :replies, only: [:create]
end
  • 测试通过!

增加提交回复的测试用例

scenario '输入回复内容点击"提交回复"后,正常提交回复' do
  visit "/topics/#{@topic.id}"

  fill_in 'reply_content', with: "回复测试"
  click_button "提交回复"

  current_path.should == topic_path(@topic)
  page.should have_content "回复测试"
end
  • 测试失败:uninitialized constant RepliesController
  • 原因:没有replies这个controller

rails console中执行

[34] pry(main)> generate "controller replies"
      create  app/controllers/replies_controller.rb
      invoke  haml
      create    app/views/replies
=> "Completed"
[35] pry(main)>
  • 测试失败:The action 'create' could not be found for RepliesController
  • 原因:没有create方法

编辑controllers/replies_controller.rb,增加create方法

def create
end
  • 测试失败:Missing template replies/create, application/create with {:local...
  • 原因:没有replies/create模板

编辑controllers/replies_controller.rb,增加实际逻辑

class RepliesController < ApplicationController
  def create
    topic = Topic.find(params[:topic_id])
    reply = topic.replies.build params[:reply]
    reply.user = current_user
    reply.save

    redirect_to topic
  end
end
  • 测试通过!

完成,提交代码

git add .
git commit 
git checkout dev
git merge f11 --no-ff
git branch -d f11

!!全部完成!!

共收到 8 条回复
172

看完了

2650

#1楼 @iBachue 谢谢捧场!

96

您好,咨询您一个问题啊:我使用RSpec+Capybara 组合,测试系统的登录;我的测试案例能够创建用户名和密码,也能激活;但是登录的时候却总是登录失败;提示“用户名或密码错误”,您遇到过这样的问题嘛?

2650

#3楼 @charleslei 没遇到过。而且只是这些信息的话,还不好判断具体是哪儿的问题。还是得具体debug一下,看“用户名密码错误”的具体情况才能知道原因

96

#4楼 @blueplanet 恩。才找到原因,是RSpec+Capybara的组合在服务器端获得不到session,想了一个办法绕过去了。再问一下,这个组合可以模拟操作浏览器上面的flash么?比如点击flash上面的一个按钮?

2650

#5楼 @charleslei 解决了就好! flash我还真不清楚。从原理上来说应该是够呛。flash内部的东西貌似都是封闭的没办法获取到,所以应该操作不了。纯属猜测哈

96

mark mark

29283

跟着做了一遍,很有帮助,十分感谢!👍

2650 blueplanet 使用 RSpec + Capybara 简单 BDD 入门 -目录 中提及了此贴 12月19日 16:51
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册