Rails TDD与RSpec&水豚未通过

时间:2016-12-08 17:12:17

标签: ruby-on-rails-4 rspec tdd capybara rspec-rails

我对Rails TDD很新,但我想借此机会学习它。但是,我有一个接收客户反馈的MVC应用程序。我做的是先开发这个功能,然后开始TDD(我知道它应该是另一回事:P。但是因为我是TDD的新手,所以我想我会把它们放到我的功能完成后(路线,控制器,模型验证)。

然而,我无法通过测试。我可以知道测试代码有什么问题吗?我应该如何创建一个SAMPLE数据ONCE并用它来测试1个控制器中的所有上下文。我应该如何组织我的测试。有什么提示可以为TDD初学者做些什么改进?我读过一些博客&我们可以使用工厂女孩的文章?但是我应该如何定义“数据”并且我需要额外的文件来存储值或什么?

如果我错了,还要纠正我。 Capybara用于UI测试吗?因为它在UI测试中使用更多。像Selenium这样的其他工具可以用来代替Capybara吗?

feedback.rb

class Feedback < ActiveRecord::Base
  validates_presence_of :name, :message => "Name is required before giving a feedback."
  validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, :message => "Invalid email address !", :allow_blank => true
  validates :telephone_no, :numericality => {:allow_blank => true}
end

feedbacks_controller.rb

class FeedbacksController < ApplicationController

  def create
    @feedback = Feedback.create(feedback_params)

    if @feedback.errors.any?
      flash[:error] = @feedback.errors
      render 'new'
    else
      redirect_to :back
    end

  end

  def new
    @feedback = Feedback.new
  end

  private
    def feedback_params
      params.require(:feedback).permit(:name, :email, :telephone_no, :comment,
                     :approved)
    end

end

feedback_controller_spec.rb     需要“rails_helper”

describe 'Feedback#Create' do

  context 'when param[:name] is not present' do
    @feedback = Feedback.create
    it 'should flash error' do
      expect(flash[:error]).to match(/Name is required before giving a feedback .*/)
    end
    it 'should render back to new' do
      is_expected.to render_template new_path
    end
  end


  context 'when param[:name] is present' do
    @feedback = Feedback.create(:name => "Hah")
    @feedback.save
    it 'should redirect to homepage' do
      is_expected.to redirect_to new_feedback_path
    end
  end


  context 'when param[:name] is present but with invalid param[:email]' do
    it 'should flash error' do
    end
  end

end

1 个答案:

答案 0 :(得分:0)

在一个问题中有很多问题,并且可能会被标记为过于宽泛 - 但这是一个基本的概述

Capybara:一个用于控制浏览器并根据这些浏览器中页面内容进行断言的库。如果你使用selenium驱动程序,那么Capybara会使用seleniun,所以是的,你可以换掉Selenium for Capybara并写一堆代码 - Capybara让它变得更容易。 Capybara用于功能规格(通过UI驱动的端到端测试) - 不是控制器规格,并且您所显示的测试目前都没有使用Capybara。它的匹配器也可用于视图规范。

测试数据:应为每个测试创建数据,以便每个测试都独立于其他测试。默认情况下,RSpec以随机顺序运行测试以强制执行该操作。在rails,fixture和工厂中为测试创建数据有两种主要方式。 FactoryGirl是工厂的一个实现,允许您在模型中设置属性的默认值,然后仅使用测试特别需要的属性值覆盖这些值(使用其他默认值保持对象有效)。 Getting Started Guide提供了大量使用它的示例。