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

blueplanet · 2013年01月05日 · 最后由 blueplanet 回复于 2013年04月11日 · 6325 次阅读

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

用户故事

访问者希望看到帖子的节点

  • 在帖子列表中显示帖子名称

环境准备

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

步骤

新建文件spec/features/guest_can_see_node_name_spec.rb

# coding: utf-8
feature '访问者希望看到帖子的节点名称' do
  background do
    Topic.delete_all

    Topic.create title: "DHH 的公开课"
    Topic.create title: "Rails3 中 compass 的 IE 使用问题"
    Topic.create title: "这周二上海搞Ruby Tuesday么?"
  end

  scenario do
    visit '/topics'

    page.should have_content '瞎扯淡'
  end
end
  • 测试失败:expected there to be text "瞎扯淡" in "社区 会员 knowan...
  • 原因:还没有实现的代码

编辑 topics/index.html.haml

把这一行

= link_to "分享", nil, class: "node"

修改为

= link_to topic.node.name, nil, class: "node"
  • 测试失败:undefined methodnode' for #Topic:0x007fa4bc0d96d0`
  • 原因:没有node这个方法

编辑model/topic.rb

增加

belongs_to :node
  • 测试失败:undefined methodname' for nil:NilClass`
  • 原因:node没有值

生成Node这个model,在rails console中执行

[5] pry(main)> generate "model node name:string"
      invoke  active_record
      create    db/migrate/20121231023808_create_nodes.rb
      create    app/models/node.rb
=> "Completed"
[6] pry(main)>

增加node_id。在rails console中执行

[13] pry(main)> generate "migration AddNodeIdToTopics node_id:integer"
      invoke  active_record
      create    db/migrate/20121231030435_add_node_id_to_topics.rb
=> "Completed"
[14] pry(main)>

执行数据库升级

bundle exec rake db:migrate
bundle exec rake db:test:prepare

修改测试用例

# coding: utf-8
feature '访问者希望看到帖子的节点名称' do
  background do
    Topic.delete_all
    Node.delete_all

    node = Node.create name: "瞎扯淡"

    Topic.create title: "DHH 的公开课", node: node
    Topic.create title: "Rails3 中 compass 的 IE 使用问题", node: node
    Topic.create title: "这周二上海搞Ruby Tuesday么?", node: node
  end

  scenario '访问/topics, 应该显示所有帖子的节点名称' do
    visit '/topics'

    Topic.all.each do |topic|
      page.should have_content topic.node.name
    end
  end
end
  • 测试失败:Can't mass-assign protected attributes: node
  • 原因:没有对node设置访问属性

修改model/node.rb,增加node的属性声明

attr_accessible :name, :node
  • 当前测试成功,但前一个测试失败
  • 原因:前一个测试用例中没有设置node信息

修改测试用例spec/features/guest_can_see_all_topics_spec.rb,增加Node的赋值

Node.delete_all

node = Node.create name: "瞎扯淡"

Topic.create title: "DHH 的公开课", node: node
Topic.create title: "Rails3 中 compass 的 IE 使用问题", node: node
Topic.create title: "这周二上海搞Ruby Tuesday么?", node: node
  • 测试全部通过

提交代码

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

下一步骤:使用 RSpec+Capybara 简单 BDD 入门 -3

修改测试用例 spec/features/guest_can_see_all_topics_spec.rb,增加 Node 的赋值

这个没看懂。最后也没通过。

#1 楼 @chenge “guest_can_see_all_topics_spec”是在上一个帖子中增加的。 当时由于还没有node这个属性,所以没有相关的赋值部分。 在当前这个帖子中,由于增加了node属性所以会导致测试失败,所以需要把“guest_can_see_all_topics_spec”文件中Topic.create的语句都增加node: node的赋值

这样说的话明白了么?

#2 楼 @blueplanet 你前面的代码不是有 node: node 么。

建议你自己按照教程做一遍,看有没有问题。

好像你这个帖子有回复也不显示在第一行,是否需要咨询下?

#3 楼 @chenge 现在这个帖子“使用 RSpec+Capybara 简单 BDD 入门 -2”˚中,新增加了guest_can_see_node_name_spec.rb文件,修改的也都是这个文件。

而最后的修改,是要修改上一个帖子“RSpec+Capybara 简单 BDD 入门 -1”中新建的guest_can_see_all_topics_spec.rb文件,不是同一个文件。

#5 楼 @blueplanet 你原文描述不清晰啊。

建议参考下 angularjs 的官网教程,每个步骤是独立的 git 分支,非常清楚。

#6 楼 @chenge 这不是写了修改哪个文件了么?

`修改测试用例 spec/features/guest_can_see_all_topics_spec.rb,增加 Node 的赋值

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