我对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
答案 0 :(得分:0)
在一个问题中有很多问题,并且可能会被标记为过于宽泛 - 但这是一个基本的概述
Capybara:一个用于控制浏览器并根据这些浏览器中页面内容进行断言的库。如果你使用selenium驱动程序,那么Capybara会使用seleniun,所以是的,你可以换掉Selenium for Capybara并写一堆代码 - Capybara让它变得更容易。 Capybara用于功能规格(通过UI驱动的端到端测试) - 不是控制器规格,并且您所显示的测试目前都没有使用Capybara。它的匹配器也可用于视图规范。
测试数据:应为每个测试创建数据,以便每个测试都独立于其他测试。默认情况下,RSpec以随机顺序运行测试以强制执行该操作。在rails,fixture和工厂中为测试创建数据有两种主要方式。 FactoryGirl是工厂的一个实现,允许您在模型中设置属性的默认值,然后仅使用测试特别需要的属性值覆盖这些值(使用其他默认值保持对象有效)。 Getting Started Guide提供了大量使用它的示例。