はじめに
CircleCIを使ってRSpecのテストを走らせるとJavascriptの処理だけ実行されずテストが通らず困っています。
自作Railsアプリ上でGoogleMapAPIを使った機能があるのですが、そのなかでgeocodeを使って、名称から緯度と経度を取得しています。その処理がjavascriptで書かれており、そこだけ実行されません。
ローカルでRSpecを走らせた場合は問題なく成功しています。CircleCIの時のみ失敗してしまいます。
アドバイス頂ければ幸いです。
エラーコード
CircleCIコンソール上で表示されるエラー
Failure/Error: if @training_post.save ActiveRecord::NotNullViolation: Mysql2::Error: Field 'latitude' doesn't have a default value: INSERT INTO `spots` (`address`, `training_post_id`, `created_at`, `updated_at`) VALUES ('筑波ジャンボゴルフセンター', 4, '2020-09-17 09:22:15', '2020-09-17 09:22:15') [Screenshot]: tmp/screenshots/failures_r_spec_example_groups_nested_nested_3_nested_正常に投稿される_797.png ./app/controllers/training_posts_controller.rb:27:in `create' ------------------ --- Caused by: --- Mysql2::Error: Field 'latitude' doesn't have a default value ./app/controllers/training_posts_controller.rb:27:in `create'
ソースコード
.circleci/config.yml
version: 2.1 orbs: ruby: circleci/ruby@1.1.0 jobs: build: docker: - image: circleci/ruby:2.5.1-node-browsers environment: BUNDLER_VERSION: 2.1.4 steps: - checkout - ruby/install-deps test: parallelism: 2 docker: - image: circleci/ruby:2.5.1-node-browsers environment: DB_HOST: 127.0.0.1 RAILS_ENV: test BUNDLER_VERSION: 2.1.4 - image: circleci/mysql:8.0 command: --default-authentication-plugin=mysql_native_password environment: MYSQL_ALLOW_EMPTY_PASSWORD: 'true' MYSQL_ROOT_HOST: '%' steps: - checkout - ruby/install-deps - run: mv config/database.yml.ci config/database.yml - run: name: Wait for DB command: dockerize -wait tcp://localhost:3306 -timeout 1m - run: bundle exec rake db:create - run: bundle exec rake db:schema:load # Run rspec in parallel - ruby/rspec-test - ruby/rubocop-check deploy: docker: - image: circleci/ruby:2.5.1-node-browsers environment: BUNDLER_VERSION: 2.1.4 steps: - checkout - ruby/install-deps - add_ssh_keys: fingerprints: "26:12:37:99:6c:1f:d2:31:b6:a8:22:6a:13:9c:56:fb" - deploy: name: Capistrano deploy command: bundle exec cap production deploy workflows: version: 2 build_accept_deploy: jobs: - build - test: requires: - build - deploy: requires: - test filters: branches: only: master
app/assets/javascripts/googlemap.js
let map let Geocoder function initMap(){ geocoder = new google.maps.Geocoder() if(document.getElementById('map')){ map = new google.maps.Map(document.getElementById('map'), { center: {lat: 35.6594666, lng: 139.7005536}, zoom: 15, }); }else{ map = new google.maps.Map(document.getElementById('show_map'), { center: {lat: gon.lat, lng: gon.lng}, zoom: 15, }); marker = new google.maps.Marker({ position: {lat: gon.lat, lng: gon.lng}, map: map }); } } function codeAddress(){ let inputAddress = document.getElementById('address').value; geocoder.geocode( {'address': inputAddress}, function(results, status) { if (status == 'OK') { let lat = results[0].geometry.location.lat(); let lng = results[0].geometry.location.lng(); let mark = { lat: lat, lng: lng }; map.setCenter(results[0].geometry.location); let marker = new google.maps.Marker({ map: map, position: results[0].geometry.location }); } else { alert('該当する結果がありませんでした'); } }); }
spec/system/training_post_spec.rb
require 'rails_helper' describe '練習記録投稿機能', type: :system do let(:user_a) { FactoryBot.create(:user, nickname: 'ユーザーA', email: 'a@example.com') } let!(:training_post_a) { FactoryBot.create(:training_post, training_impression: 'RSpecテスト', user: user_a) } before do visit login_path fill_in 'session_email', with: login_user.email fill_in 'session_password', with: login_user.password click_button 'ログインする' end shared_examples_for 'ユーザーAが投稿した練習記録が表示される' do it { expect(page).to have_content 'RSpecテスト' } end describe '投稿一覧表示機能' do context 'ユーザーAがログインしているとき' do let(:login_user) { user_a } it_behaves_like 'ユーザーAが投稿した練習記録が表示される' end end describe '投稿詳細表示機能' do context 'ユーザーAがログインしているとき' do let(:login_user) { user_a } before do visit user_path(user_a) end it_behaves_like 'ユーザーAが投稿した練習記録が表示される' end end describe '新規投稿機能' do let(:login_user) { user_a } before do visit new_training_post_path # 入力必須項目 fill_in '練習時間', with: training_time fill_in '練習で打った球数', with: training_hits fill_in 'address', with: address # 入力任意項目 check '球が上手く当たらない' fill_in 'training_post_training_impression', with: '新規投稿のテストを書く' click_button '投稿する' end context '投稿画面で必須項目を入力したとき' do let(:training_time) { 2 } let(:training_hits) { 150 } let(:address) { '筑波ジャンボゴルフセンター' } it '正常に投稿される' do expect(page).to have_selector '.alert-success', text: '投稿しました。' end end context '投稿画面で必須項目を入力しなかったとき' do let(:training_time) { '' } let(:training_hits) { '' } let(:address) { '' } it 'エラーが表示される' do within '#error_explanation' do expect(page).to have_content '練習場所を入力してください' expect(page).to have_content '練習時間を入力してください' expect(page).to have_content '練習で打った球数を入力してください' end end end end end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/23 02:32