質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Circle CI

Circle CIは、クラウド上に簡単にCI環境を構築できるWebサービスです。GitHubと連携させ、CIしたいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

Q&A

解決済

1回答

1102閲覧

CircleCIでJavascriptが実行されない

mikepp

総合スコア11

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Circle CI

Circle CIは、クラウド上に簡単にCI環境を構築できるWebサービスです。GitHubと連携させ、CIしたいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

0グッド

0クリップ

投稿2020/09/17 12:43

はじめに

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

正確な回答ではないけど

Mysql2::Error: Field 'latitude' doesn't have a default value:

そのまんま訳すよ
MySQLのspotsテーブルに追加する時にlatitude項目に規定値が設定されていない為追加できませんでした。

SQL

1INSERT INTO `spots` (`address`, `training_post_id`, `created_at`, `updated_at`) 2VALUES ('筑波ジャンボゴルフセンター', 4, '2020-09-17 09:22:15', '2020-09-17 09:22:15')

上記SQLをみると'latitude'項目がありません。
このINSERT文に'latitude'を追加するようにするか
'latitude'に規定値を設定してみて下さい。

で'latitude'にGoogle API で取得した内容がはいるの?

投稿2020/09/20 16:31

編集2020/09/20 16:34
kuma_kuma_

総合スコア2506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikepp

2020/09/23 02:32

回答遅れて申し訳ございません。 自己解決しました! 'latitude'にGoogle API で取得した内容がはいります。 stubを用意することで、データの入力ができるようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問