私はこのシナリオを作成しようとしています:
scenario 'creating a new item category' do
page.find("#launch-category-form-modal").click
expect(page).to have_selector("#category-form-modal.active")
fill_in("item_category[name]", with: "pudim")
find("#submit-category-form-modal").click
within ".sweet-alert.visible" do
find('button.confirm').trigger('click')
end
expect(page).to have_selector(".category-line:last-child td:first-child",
text: "pudim")
end
フローは次のとおりです。
- ユーザーは入力に名前を入力します。
- 送信ボタンをクリックします。
- スイート アラートが成功メッセージと共に表示されます。
- スイートアラート内の「OK」をクリックします。
- jQuery で新しい行が作成され、html テーブルに追加されます。
このフローを担当する JS コードは次のとおりです。
$.ajax({
url: "/admin/item_categories",
method: "POST",
data: data,
success: function(data) {
if (data.status == true) {
swal(
'Success',
'Item Category created successfully',
'success'
);
var newLine = createItemCategoryLine(data.itemCategory);
$("#item-category-table-body").append(newLine);
$("#category-form-modal").modal('hide');
$("form[action='/admin/item_categories']")[0].reset();
} else if(data.status == false) {
swal(
'Error',
'Something went wrong!',
'error'
)
}
}
をクリックした後submit button
、カピバラは甘いアラートを見つけることができません。使用save_and_open_screenshot
してみましたが、スイートアラートが画面に表示されません。byebug
コントローラーでも試しましたが、呼び出されません。
を使用して:selenium_chrome
います。
助けてくれてありがとう!
編集 1
@ThomasWalpole のいくつかのコメントの後、<%= csrf_meta_tag %>
対応するタグをレンダリングしない理由を見つけようとしました。かどうかを確認するために呼び出すだけであることがわかりました。テスト環境で動かしているので、. テストを変更して再実行しました。csrf メタ タグはレンダリングされましたが、まだ http ステータス 405 - ajax 呼び出し後にメソッドが許可されていません。csrf_meta_tag
protect_against_forgery?
config.action_controller.allow_forgery_protection
true
config.action_controller.allow_forgery_protection
false
true
編集 2
@ThomasWalpoleが要求した私のルート:
item_categories_path GET /admin/item_categories(.:format)
item_categories#index
create_item_category_path POST /admin/item_categories(.:format)
item_categories#create
update_item_category_path PATCH /admin/item_categories/:id(.:format)
item_categories#update
delete_item_category_path DELETE /admin/item_categories/:id(.:format)
item_categories#destroy
編集 3
私のカピバラの設定:
ENV["RAILS_ENV"] ||= "test"
require File.expand_path("../../config/environment", __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require "spec_helper"
require "rspec/rails"
# Add additional requires below this line. Rails is not loaded until this point!
require "capybara/rspec"
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
ActiveRecord::Migration.maintain_test_schema!
Capybara.register_driver :selenium_chrome do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome)
end
Capybara.javascript_driver = :selenium_chrome
# To ensure that browser tests can find the test server process,
# always include the port number in URLs.
Capybara.always_include_port = true