【问题标题】:Rails TDD with RSpec & Capybara fail to pass带有 RSpec 和 Capybara 的 Rails TDD 未能通过
【发布时间】:2016-12-08 17:12:16
【问题描述】:

我对 Rails TDD 很陌生,但想借此机会学习一下。但是,我有一个接收客户反馈的 MVC 应用程序。我所做的是首先开发该功能,然后再启动 TDD(我知道它应该是相反的:P。但是因为我是 TDD 的新手,所以我想一旦我完成了我的功能,我就会把它们放进去(路由、控制器、模型验证)。

但是,我无法通过测试。我能知道测试代码有什么问题吗?以及我应该如何创建一个 SAMPLE 数据 ONCE 并使用它来测试 1 个控制器中的所有上下文。我应该如何组织我的测试。有什么提示可以为 TDD 的初学者改进吗?我已经阅读了一些我们可以使用 factorygirl 的博客和文章?但是我应该如何定义“数据”,我是否需要额外的文件来存储值或其他东西?

如果我错了也请纠正我。 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

【问题讨论】:

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


    【解决方案1】:

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

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

    测试数据:应为每个测试创建数据,以便每个测试独立于其他所有测试。默认情况下,RSpec 以随机顺序运行测试以强制执行。有两种主要方法可以为 rails、fixture 和 factory 中的测试创建数据。 FactoryGirl 是工厂的一种实现,它允许您为模型中的属性设置默认值,然后仅使用测试特别需要的属性值覆盖这些值(同时使用其他默认值来保持对象有效)。 Getting Started Guide 给出了很多使用它的例子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多