设置authenticity_token时RSpec + Poltergeist失败

时间:2018-04-01 03:10:39

标签: ruby-on-rails rspec capybara poltergeist

我正在尝试使用RSpec + Polgergeist测试我的Rails应用中的功能。

我的功能规格现在非常基础:

RSpec.feature 'Listing owners can create new listings' do
  let(:owner) { create(:user, :owner) }

  before do
    login_as owner
    # I've also tried this with as recommended by Devise when using Capybara-Webkit:
    # login_as(user, scope: :user, run_callbacks: false)
    visit new_listing_path
  end

  scenario 'successfully', js: true do
    fill_in 'Field 1', with: 'Example'
    click_link 'Create'

    # expectations here...
  end
end

我的 rails_helper.rb

中有以下内容
require 'capybara/poltergeist'

RSpec.configure do |config|
  # ...
  config.include Warden::Test::Helpers, type: :feature
  config.after(type: :feature) { Warden.test_reset! }
  # ...
end

并在 support / poltergeist.rb 文件中

RSpec.configure do |config|
  Capybara.javascript_driver = :poltergeist

  # Increase timeout in case asset compilation
  # takes longer than anticipated.
  Capybara.register_driver :poltergeist do |app|
    Capybara::Poltergeist::Driver.new(app, {timeout: 60})
  end
end

失败的确切位置是这样的,我使用Vue.js设置CSRF令牌:

import Vue from 'vue/dist/vue.esm'
import VueResource from 'vue-resource'

Vue.use(VueResource)

document.addEventListener('DOMContentLoaded', () => {

  if(document.getElementById('listing-multistep') !== null) {
    Vue.http.headers.common['X-CSRF-Token'] = document.querySelector('input[name="authenticity_token"]').getAttribute('value');
    var listingForm = document.getElementById('listing_form');
    var listing = JSON.parse(listingForm.dataset.listing);

    // do magic....
  }
});

真实性令牌是从Rails表单部分 _form.html.erb 设置的:

<%= form_for(
  listing,
  html: { multipart: true, id: 'listing_form',
    data: {
      listing: listing.to_json(except: [:user_id, :created_at, :updated_at])
    }
  }) do |f| %>

  <fieldset class="listing-step" v-show="activeStep === 0">
    <%= render 'listings/form/basics', f: f, listing: listing %>
  </fieldset>

  <fieldset class="listing-step" v-show="activeStep === 1">
    <%= render 'listings/form/location', f: f, listing: listing %>
  </fieldset>

  <fieldset class="listing-step" v-show="activeStep === 2">
    <%= render 'listings/form/amenities', f: f, listing: listing %>
  </fieldset>

  <fieldset class="listing-step" v-show="activeStep === 3">
    <%= render 'listings/form/description', f: f, listing: listing %>
  </fieldset>
<% end %>

以这种方式设置CSRF令牌似乎在开发中工作,但是当我运行规范时,我看到以下错误:

Failure/Error: visit new_listing_path

     Capybara::Poltergeist::JavascriptError:
       One or more errors were raised in the Javascript code on the page. If you don't care about these errors, you can ignore them by setting js_errors: false in your Poltergeist configuration (see documentation for details).

       TypeError: null is not an object (evaluating 'document.querySelector('input[name="authenticity_token"]').getAttribute')
       TypeError: null is not an object (evaluating 'document.querySelector('input[name="authenticity_token"]').getAttribute')
           at http://127.0.0.1:54450/packs-test/dashboard-ca7eeed2cc4b22399ade.js:13086

所有我能想到的是,恶作剧者并没有等待DOM完全加载,但这很奇怪,因为我在document.addEventListener('DOMContentLoaded', () => {

中明确写了vue代码

另外,我还有一个 support / database_cleaner.rb 文件,其中包含以下内容:

RSpec.configure do |conf|
  conf.before(:suite) do
    DatabaseCleaner.clean_with :truncation
  end

  conf.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  conf.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation
  end

  conf.before(:each) do
    DatabaseCleaner.start
  end

  conf.after(:each) do
    DatabaseCleaner.clean
  end
end

知道可能导致上述错误的原因吗?任何帮助深表感谢! 提前致谢

更新

以下是运行规范时生成的test.log文件的副本:

   (1.3ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
   (0.2ms)  BEGIN
   (2.1ms)  ALTER TABLE "schema_migrations" DISABLE TRIGGER ALL;ALTER TABLE "ar_internal_metadata" DISABLE TRIGGER ALL;ALTER TABLE "subscriptions" DISABLE TRIGGER ALL;ALTER TABLE "listings" DISABLE TRIGGER ALL;ALTER TABLE "advertisements" DISABLE TRIGGER ALL;ALTER TABLE "chatroom_users" DISABLE TRIGGER ALL;ALTER TABLE "chatrooms" DISABLE TRIGGER ALL;ALTER TABLE "messages" DISABLE TRIGGER ALL;ALTER TABLE "pictures" DISABLE TRIGGER ALL;ALTER TABLE "friendly_id_slugs" DISABLE TRIGGER ALL;ALTER TABLE "contact_messages" DISABLE TRIGGER ALL;ALTER TABLE "users" DISABLE TRIGGER ALL
   (0.7ms)  COMMIT
   (3.9ms)            SELECT schemaname || '.' || tablename
          FROM pg_tables
          WHERE
            tablename !~ '_prt_' AND
             tablename <> 'schema_migrations'  AND tablename <> 'ar_internal_metadata'  AND
            schemaname = ANY (current_schemas(false))

   (2.5ms)  select table_name from information_schema.views where table_schema = 'salayo_test'
   (48.9ms)  TRUNCATE TABLE "public"."subscriptions", "public"."listings", "public"."advertisements", "public"."chatroom_users", "public"."chatrooms", "public"."messages", "public"."pictures", "public"."friendly_id_slugs", "public"."contact_messages", "public"."users" RESTART IDENTITY CASCADE;
   (1.3ms)  BEGIN
   (1.7ms)  ALTER TABLE "schema_migrations" ENABLE TRIGGER ALL;ALTER TABLE "ar_internal_metadata" ENABLE TRIGGER ALL;ALTER TABLE "subscriptions" ENABLE TRIGGER ALL;ALTER TABLE "listings" ENABLE TRIGGER ALL;ALTER TABLE "advertisements" ENABLE TRIGGER ALL;ALTER TABLE "chatroom_users" ENABLE TRIGGER ALL;ALTER TABLE "chatrooms" ENABLE TRIGGER ALL;ALTER TABLE "messages" ENABLE TRIGGER ALL;ALTER TABLE "pictures" ENABLE TRIGGER ALL;ALTER TABLE "friendly_id_slugs" ENABLE TRIGGER ALL;ALTER TABLE "contact_messages" ENABLE TRIGGER ALL;ALTER TABLE "users" ENABLE TRIGGER ALL
   (0.6ms)  COMMIT
   (0.3ms)  BEGIN
  User Exists (2.0ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "dianna_kilback@okeefemccullough.org"], ["LIMIT", 1]]
  SQL (1.1ms)  INSERT INTO "users" ("first_name", "last_name", "email", "encrypted_password", "created_at", "updated_at", "role") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["first_name", "Hermann"], ["last_name", "VonRueden"], ["email", "dianna_kilback@okeefemccullough.org"], ["encrypted_password", "$2a$04$sSAdYthaHRhqjUqaing/weltoDcyHyR5Fyr2Pw/8xOtvz4mMPwWYm"], ["created_at", "2018-04-01 05:32:07.693349"], ["updated_at", "2018-04-01 05:32:07.693349"], ["role", 2]]
   (0.6ms)  COMMIT
Started GET "/en/listings/new" for 127.0.0.1 at 2018-04-01 14:32:09 +0900
   (0.2ms)  BEGIN
  SQL (2.5ms)  UPDATE "users" SET "sign_in_count" = $1, "current_sign_in_at" = $2, "last_sign_in_at" = $3, "current_sign_in_ip" = $4, "last_sign_in_ip" = $5, "updated_at" = $6 WHERE "users"."id" = $7  [["sign_in_count", 1], ["current_sign_in_at", "2018-04-01 05:32:09.833321"], ["last_sign_in_at", "2018-04-01 05:32:09.833321"], ["current_sign_in_ip", "127.0.0.1/32"], ["last_sign_in_ip", "127.0.0.1/32"], ["updated_at", "2018-04-01 05:32:09.866550"], ["id", 1]]
   (0.6ms)  COMMIT
Processing by ListingsController#new as HTML
  Parameters: {"locale"=>"en"}
  Rendering listings/new.html.erb within layouts/dashboard
  Rendered listings/_prev_next_buttons.html.erb (3.6ms)
  Rendered listings/form/_basics.html.erb (30.6ms)
  Rendered listings/form/_location.html.erb (2.9ms)
  Rendered listings/form/_amenities.html.erb (0.5ms)
  Rendered listings/form/_description.html.erb (3.5ms)
  Rendered listings/_form.html.erb (79.4ms)
  Rendered listings/new.html.erb within layouts/dashboard (127.9ms)
  Rendered common/_meta_tags.html.erb (1.2ms)
  Rendered dashboard/_sidebar.html.erb (23.4ms)
  Rendered dashboard/_topbar.html.erb (4.7ms)
  Rendered common/_notices.html.erb (2.0ms)
  Rendered common/_footer.html.erb (4.9ms)
Completed 200 OK in 980ms (Views: 877.4ms | ActiveRecord: 19.7ms)
Started GET "/assets/application-a2d7fced50ec51954f27ed1fab4792ab0cd3b9b88ff496fc07bd2489660a7c42.css" for 127.0.0.1 at 2018-04-01 14:32:10 +0900
Started GET "/assets/application-e7598b8619f2ba6c7b08ce9a5471f5e4b5223c384a09f8826ae19a864a9bc6b4.js" for 127.0.0.1 at 2018-04-01 14:32:10 +0900
Started GET "/cable" for 127.0.0.1 at 2018-04-01 14:32:11 +0900
Started GET "/assets/bg_logo-db2dd881e08b614d8971e623eb0a14df67c93a5615c04ec2d7c2967893d44b2c.svg" for 127.0.0.1 at 2018-04-01 14:32:11 +0900
Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2018-04-01 14:32:11 +0900
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
Started GET "/assets/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff" for 127.0.0.1 at 2018-04-01 14:32:11 +0900
   (0.3ms)  BEGIN
   (1.6ms)  ALTER TABLE "schema_migrations" DISABLE TRIGGER ALL;ALTER TABLE "ar_internal_metadata" DISABLE TRIGGER ALL;ALTER TABLE "subscriptions" DISABLE TRIGGER ALL;ALTER TABLE "listings" DISABLE TRIGGER ALL;ALTER TABLE "advertisements" DISABLE TRIGGER ALL;ALTER TABLE "chatroom_users" DISABLE TRIGGER ALL;ALTER TABLE "chatrooms" DISABLE TRIGGER ALL;ALTER TABLE "messages" DISABLE TRIGGER ALL;ALTER TABLE "pictures" DISABLE TRIGGER ALL;ALTER TABLE "friendly_id_slugs" DISABLE TRIGGER ALL;ALTER TABLE "contact_messages" DISABLE TRIGGER ALL;ALTER TABLE "users" DISABLE TRIGGER ALL
   (0.5ms)  COMMIT
   (56.7ms)  TRUNCATE TABLE "public"."subscriptions", "public"."listings", "public"."advertisements", "public"."chatroom_users", "public"."chatrooms", "public"."messages", "public"."pictures", "public"."friendly_id_slugs", "public"."contact_messages", "public"."users" RESTART IDENTITY CASCADE;
   (1.7ms)  BEGIN
   (2.7ms)  ALTER TABLE "schema_migrations" ENABLE TRIGGER ALL;ALTER TABLE "ar_internal_metadata" ENABLE TRIGGER ALL;ALTER TABLE "subscriptions" ENABLE TRIGGER ALL;ALTER TABLE "listings" ENABLE TRIGGER ALL;ALTER TABLE "advertisements" ENABLE TRIGGER ALL;ALTER TABLE "chatroom_users" ENABLE TRIGGER ALL;ALTER TABLE "chatrooms" ENABLE TRIGGER ALL;ALTER TABLE "messages" ENABLE TRIGGER ALL;ALTER TABLE "pictures" ENABLE TRIGGER ALL;ALTER TABLE "friendly_id_slugs" ENABLE TRIGGER ALL;ALTER TABLE "contact_messages" ENABLE TRIGGER ALL;ALTER TABLE "users" ENABLE TRIGGER ALL
   (0.5ms)  COMMIT

0 个答案:

没有答案