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

blueplanet · 2013年01月05日 · 最后由 ringokun 回复于 2016年12月19日 · 4293 次阅读

目录: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

!! 全部完成!!

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

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

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

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

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

blueplanet 使用 RSpec + Capybara 简单 BDD 入门 -目录 提及了此话题。 12月19日 16:51
blueplanet 使用 RSpec+Capybara 简单 BDD 入门 -10 提及了此话题。 04月03日 10:56
需要 登录 后方可回复, 如果你还没有账号请 注册新账号