正确的方法来测试rails页面是否正常工作

时间:2015-04-21 16:27:25

标签: ruby-on-rails testing rspec devise capybara

作为我进入自动化测试的第一步,我想确保在浏览器中可以访问所有“GET”类型的页面。我的规格还要求:

  • 使用Devise登录(设计只提供RSpec测试,所以我需要RSpec吗?)

  • 必须检查视图是否可以呈现。例如,如果我有<%= true = false%>在我的一个观点中,当在浏览器中查看时它会出错,自动测试应该选择这个。 (似乎RSpec不支持测试视图中渲染的内容,所以我需要水豚吗?)

我今天的尝试要求我包括RSpec,FactoryGirl和Capybara(用于检查视图)。这是一场噩梦。水豚仍未运作。

这是大多数rails开发人员测试的方式吗?

1 个答案:

答案 0 :(得分:1)

尽管大多数Devise示例都使用RSpec,但您可以使用Minitest(内置的Ruby测试框架)。您使用的完全取决于您,但我觉得用一种像Ruby一样动态的语言编写愚蠢的Java-eske测试类是错误的。

这只是意见。

第一次获得一个体面的测试套件可能会很痛苦,但从长远来看确实可以获得回报。

通常我会在三个级别进行测试:

型号规格

测试模型上的低级功能。它更快更快比试图设置Web请求以测试模型对不同输入的反应更容易。

使用rspec-itsrspec-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

Feature specs

您模仿访问者的行为 - 点击并在页面内容上写下期望。我用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。我通常只测试控制器:

  • 返回正确的HTTP代码。
  • 呈现正确的模板。
  • 授权用户,如果未获得授权,则拒绝访问。

控制器规范示例:

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