【发布时间】: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