使用Rails 5.1和Vue.js进行片状系统测试

时间:2018-04-22 16:02:25

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

我一直试图调试这几天,只是无法弄清楚问题是什么。我最初认为这是一个顺序依赖,但我不再这么认为,所以rspec --bisect=verbose

我现在倾向于Devise / Warden助手不能正常工作,我没有正确设置capybara / web驱动程序或其他东西。

此测试有时失败:

  1. 在重定向时,从菜单中选择项目以重定向到另一个页面。例如redirects to Account Settings page after pressing Account Settings。这是我责备Devise助手的地方,因为当我登陆主页时登录,但当我到达帐户设置时current_user返回nil,因此示例因重定向到登录而失败页。
  2. 这也是特定于测试的,实时代码在几个月内没有任何问题。

    系统测试

    require 'rails_helper'
    
    RSpec.describe 'home page', type: :system do
      before(:context) do
        WebMock.disable_net_connect!(allow_localhost: true)
      end
    
      after(:each) do
        Warden.test_reset!
      end
    
      context 'when not logged in' do
        it 'displays login with discord button' do
          visit '/'
    
          expect(page).to have_content 'Login with Discord'
        end
    
        it 'logs in with discord after clicking Login with Discord' do
          OmniAuth.config.test_mode = true
    
          visit '/'
    
          click_on 'Login with Discord'
    
          expect(page).to_not have_content 'Login with Discord'
    
          find('.profile-menu').hover
    
          expect(page).to have_content 'Account Settings'
          expect(page).to have_content 'Event Calendar'
          expect(page).to have_content 'Logout'
        end
      end
    
      context 'when logged in' do
        context 'as an average user' do
          before do
            @user = build(:user, confirmed_at: Time.now)
            create(:profile, user: @user)
    
            login_as(@user, scope: :user)
          end
    
          it 'shows profile menu' do
            visit '/'
    
            find('.profile-menu').hover
    
            expect(page).to have_content 'Account Settings'
            expect(page).to have_content 'Event Calendar'
            expect(page).to have_content 'Logout'
          end
    
          it 'logs user out after pressing Logout' do
            visit '/'
    
            find('.profile-menu').hover
            find('.logout').click
    
            expect(page).to have_content 'Login with Discord'
          end
    
          it 'redirects to Events page after pressing Event Calendar' do
            event = create(:event)
    
            visit '/'
    
            find('.profile-menu').hover
            find('.event-calendar').click
    
            expect(page).to have_content event.title
          end
    
          it 'redirects to Account Settings page after pressing Account Settings' do
            visit '/'
    
            find('.profile-menu').hover
            find('.settings').click
    
            expect(page).to have_content 'Account Settings'
          end
        end
    
        context 'as an organiser' do
          before do
            @user = build(:user, confirmed_at: Time.now, role: :organiser)
            create(:profile, user: @user)
    
            login_as(@user, scope: :user)
          end
    
          it 'shows profile menu with Organiser Dashboard link' do
            visit '/'
    
            find('.profile-menu').hover
    
            expect(page).to have_content 'Organiser Dashboard'
          end
    
          it 'redirects to Organiser Dashboard page after pressing Organiser Dashboard' do
            visit '/'
    
            find('.profile-menu').hover
            find('.organiser-dashboard').click
    
            expect(page).to have_content 'Create Event'
          end
        end
      end
    end
    

    设计配置

    require 'devise'
    
    RSpec.configure do |config|
      config.include Warden::Test::Helpers
    end
    

    Javascript驾驶菜单重定向

    handleCommand(command) {
      if (command === "logout") {
        Rails.ajax({
          url: "/sign_out",
          type: "DELETE",
          dataType: "json",
          success: (signed_in_status) => {
            this.$store.commit('authenticate', false)
            this.$message.success('You logged out');
            location.href = "/";
          },
          error: (signed_in_status) => {
            this.$store.commit('authenticate', true)
            this.$message.error('Something went wrong');
          }
        })
      }
      else if (command === "settings") {
        location.href = "/users/edit";
      }
      else if (command === "events") {
        location.href = "/events";
      }
      else if (command === "organiser") {
        location.href = "/admin/events";
      }
    }
    

1 个答案:

答案 0 :(得分:0)

我似乎解决了这个问题。我已经尝试过这个SO答案中提到的几件事。据我所知,修复它的原因是:

 RSpec.configure do |config|
   config.include Warden::Test::Helpers
 end

 RSpec.configure do |config|
   config.include Devise::Test::IntegrationHelpers, type: :system
 end

这也让我放弃了:

  after(:each) do
    Warden.test_reset!
  end

在我的所有测试中。我已经进行了不少测试而且他们不再失败,所以我现在假设这已经确定了。