作为我进入自动化测试的第一步,我想确保在浏览器中可以访问所有“GET”类型的页面。我的规格还要求:
使用Devise登录(设计只提供RSpec测试,所以我需要RSpec吗?)
必须检查视图是否可以呈现。例如,如果我有<%= true = false%>在我的一个观点中,当在浏览器中查看时它会出错,自动测试应该选择这个。 (似乎RSpec不支持测试视图中渲染的内容,所以我需要水豚吗?)
我今天的尝试要求我包括RSpec,FactoryGirl和Capybara(用于检查视图)。这是一场噩梦。水豚仍未运作。
这是大多数rails开发人员测试的方式吗?
答案 0 :(得分:1)
尽管大多数Devise示例都使用RSpec,但您可以使用Minitest(内置的Ruby测试框架)。您使用的完全取决于您,但我觉得用一种像Ruby一样动态的语言编写愚蠢的Java-eske测试类是错误的。
这只是意见。
第一次获得一个体面的测试套件可能会很痛苦,但从长远来看确实可以获得回报。
通常我会在三个级别进行测试:
测试模型上的低级功能。它更快更快比试图设置Web请求以测试模型对不同输入的反应更容易。
使用rspec-its
和rspec-mongoid
测试模型的示例:
require 'rails_helper'
RSpec.describe Photo, type: :model do
it { should validate_presence_of :flickr_uid }
it { should belong_to_related :photoset }
it { should belong_to :user }
describe ".find_or_create_from_flickr" do
subject do
Photo.find_or_create_from_flickr(OpenStruct.new(
id: 'ABC_123',
title: 'foo'
))
end
its(:flickr_uid) { should eq 'ABC_123' }
its(:title) { should eq 'foo' }
end
end
您模仿访问者的行为 - 点击并在页面内容上写下期望。我用RSpec& amp;水豚。我尝试至少覆盖应用程序中的“快乐”路径。
require 'rails_helper'
RSpec.feature "User profile management" do
let!(:user) { create(:user) }
background do
login_as user
end
def visit_profile_page
visit root_path
click_link user.nickname
end
scenario "a user can edit his profile" do
visit_profile_page
click_link I18n.t('users.show.edit_profile')
page.fill_in I18n.t('simple_form.labels.user.name'), with: 'New Name'
click_button 'Update User'
expect(page).to have_content 'New Name'
end
scenario "a user can view index" do
visit users_path
expect(page).to have_link user.nickname
end
end
测试应用程序的API。我通常只测试控制器:
控制器规范示例:
require 'rails_helper'
require 'support/controller_spec_helper'
RSpec.describe UsersController, type: :controller do
include ControllerSpecHelper
let(:user) { create(:user) }
before { set_current_user(nil) }
subject { response }
describe "GET #show" do
before { get :show, id: user }
it { should have_http_status :success }
it { should render_template :show }
it "should assign user as @user" do
expect(assigns(:user)).to be_a User
end
end
describe "GET #edit" do
context "when unauthorized" do
it "denies access" do
expect {
get :edit, id: user
}.to raise_error(CanCan::AccessDenied)
end
end
context "when authorized" do
before do
set_current_user(user)
get :edit, id: user
end
it { should have_http_status :success }
it { should render_template :edit }
it "should assign user as @user" do
expect(assigns(:user)).to be_a User
end
end
end
# ...
end