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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Ruby on Rails 6

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

RSpec

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Circle CI

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

Q&A

解決済

1回答

967閲覧

RSpecがローカルでは成功するがCircleCIだと「undefined method `now' for nil:NilClass」になってしまう。

退会済みユーザー

退会済みユーザー

総合スコア0

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Ruby on Rails 6

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

RSpec

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Circle CI

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

0グッド

0クリップ

投稿2022/06/01 11:25

編集2022/06/01 11:27

前提

factorybotを使用しRSpecをCircleCIにて自動テストしようとしたところ、
ローカルでは成功するが、エラーが起きてしまいます。

実現したいこと

・CircleCIでもテストが通るようにしたい。

発生している問題・エラーメッセージ

CircleCI

1#!/bin/bash -eo pipefail 2bundle exec rspec $(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings) \ 3 || (printf "====== RETRYING...\n\n\n"; bundle exec rspec --only-failures) 4 5Error reading historical timing data: file does not exist 6Requested weighting by historical based timing, but they are not present. Falling back to weighting by name. 7..FFFFFF 8 9Failures: 10 11 1) Post Post 全ての投稿を取得 12 Failure/Error: get '/api/v1/posts' 13 14 NoMethodError: 15 undefined method `now' for nil:NilClass 16 # ./spec/requests/api/v1/posts_spec.rb:11:in `block (3 levels) in <main>' 17 18 2) Post Post 特定の投稿を取得 19 Failure/Error: get "/api/v1/posts/#{@post.id}" 20 21 NoMethodError: 22 undefined method `now' for nil:NilClass 23 # ./spec/requests/api/v1/posts_spec.rb:19:in `block (3 levels) in <main>' 24 25 3) Post Post 投稿編集 26 Failure/Error: put "/api/v1/posts/#{post.id}", params: { name: 'new-title' } 27 28 NoMethodError: 29 undefined method `now' for nil:NilClass 30 # ./spec/requests/api/v1/posts_spec.rb:54:in `block (3 levels) in <main>' 31 32 4) Post Post 投稿削除 33 Failure/Error: expect { delete "/api/v1/posts/#{post.id}" }.to change(Post, :count).by(-1) 34 35 NoMethodError: 36 undefined method `now' for nil:NilClass 37 # ./spec/requests/api/v1/posts_spec.rb:67:in `block (4 levels) in <main>' 38 # ./spec/requests/api/v1/posts_spec.rb:67:in `block (3 levels) in <main>' 39 40 5) User User ユーザー一覧取得 41 Failure/Error: get '/api/v1/users/' 42 43 NoMethodError: 44 undefined method `now' for nil:NilClass 45 # ./spec/requests/api/v1/users_spec.rb:10:in `block (3 levels) in <main>' 46 47 6) User User 特定ユーザー取得 48 Failure/Error: get "/api/v1/users/#{@user.id}" 49 50 NoMethodError: 51 undefined method `now' for nil:NilClass 52 # ./spec/requests/api/v1/users_spec.rb:17:in `block (3 levels) in <main>' 53 54Finished in 0.49542 seconds (files took 2.14 seconds to load) 558 examples, 6 failures 56 57Failed examples: 58 59rspec ./spec/requests/api/v1/posts_spec.rb:10 # Post Post 全ての投稿を取得 60rspec ./spec/requests/api/v1/posts_spec.rb:18 # Post Post 特定の投稿を取得 61rspec ./spec/requests/api/v1/posts_spec.rb:51 # Post Post 投稿編集 62rspec ./spec/requests/api/v1/posts_spec.rb:63 # Post Post 投稿削除 63rspec ./spec/requests/api/v1/users_spec.rb:9 # User User ユーザー一覧取得 64rspec ./spec/requests/api/v1/users_spec.rb:16 # User User 特定ユーザー取得 65 66====== RETRYING... 67 68 69 70To use `--only-failures`, you must first set `config.example_status_persistence_file_path`. 71 72 73Exited with code exit status 1 74CircleCI received exit code 1

該当のソースコード

spec/factories/posts.rb

1FactoryBot.define do 2 factory :post do 3 sequence(:name) { |n| "#{n}testpost" } 4 user_id { '1' } 5 quickword { '早速、右下のボタンで募集ページをつくりましょう!' } 6 catchcopy { 'ご閲覧ありがとうございます' } 7 member { 3 } 8 place { '集合場所' } 9 category {} 10 price { 1000 } 11 start_time { '2000-01-01T09:00:00.000Z' } 12 finish_time { '2000-01-01T03:00:00.000Z' } 13 release { '2021-5-10' } 14 image { Rack::Test::UploadedFile.new(Rails.root.join('spec/fixtures/test.jpg')) } 15 association :user 16 end 17end

spec/factories/users.rb

1FactoryBot.define do 2 factory :user do 3 name { 'testuser' } 4 sequence(:email) { |n| "tester#{n}@example.com" } 5 password { 'password' } 6 password_confirmation { 'password' } 7 end 8end

spec/models/post_spec.rb

1require 'rails_helper' 2 3RSpec.describe Post, type: :model do 4 it 'Creates Post' do 5 post = create(:post, name: 'testpost') 6 expect(post).to be_valid 7 end 8end

spec/models/user_spec.rb

1require 'rails_helper' 2 3RSpec.describe User, type: :model do 4 it 'Creates User' do 5 @user = FactoryBot.create(:user) 6 expect(@user).to be_valid 7 end 8end

spec/requests/api/v1/posts_spec.rb

1require 'rails_helper' 2 3RSpec.describe Post, type: :request do 4 describe 'Post' do 5 before(:each) do 6 @post = create(:post) 7 @posts = create_list(:post, 10) 8 end 9 10 it '全ての投稿を取得' do 11 get '/api/v1/posts' 12 JSON.parse(response.body) 13 14 # リクエスト成功を表す200が返ってきたか確認する。 15 expect(response.status).to eq(200) 16 end 17 18 it '特定の投稿を取得' do 19 get "/api/v1/posts/#{@post.id}" 20 json = JSON.parse(response.body) 21 22 # リクエスト成功を表す200が返ってきたか確認する。 23 expect(response.status).to eq(200) 24 25 # 要求した特定のポストのみ取得した事を確認する。 26 expect(json['name']).to eq(@post.name) 27 end 28 29 # it '新規投稿' do 30 # post_params = { 31 # name: 'posttest', 32 # user_id: '1', 33 # quickword: '早速、右下のボタンで募集ページをつくりましょう!', 34 # catchcopy: 'ご閲覧ありがとうございます', 35 # member: '3', 36 # place: '集合場所', 37 # category: '', 38 # price: '1000', 39 # start_time: '2000-01-01T09:00:00.000Z', 40 # finish_time: '2000-01-01T03:00:00.000Z', 41 # release: '2021-5-10', 42 # } 43 44 # # データが作成されている事を確認。 45 # expect { post '/api/v1/posts', params: post_params }.to change(Post, :count).by(+1) 46 47 # # リクエスト成功を表す200が返ってきたか確認する。 48 # expect(response.status).to eq(200) 49 # end 50 51 it '投稿編集' do 52 post = create(:post, name: 'old-title') 53 54 put "/api/v1/posts/#{post.id}", params: { name: 'new-title' } 55 json = JSON.parse(response.body) 56 57 # リクエスト成功を表す200が返ってきたか確認する。 58 expect(response.status).to eq(200) 59 60 # データが更新されている事を確認。 61 expect(json['name']).to eq('new-title') 62 end 63 it '投稿削除' do 64 post = create(:post) 65 66 # データが削除されている事を確認。 67 expect { delete "/api/v1/posts/#{post.id}" }.to change(Post, :count).by(-1) 68 69 # リクエスト成功を表す200が返ってきたか確認する。 70 expect(response.status).to eq(200) 71 end 72 end 73end

spec/requests/api/v1/users_spec.rb

1require 'rails_helper' 2 3RSpec.describe User, type: :request do 4 describe 'User' do 5 before(:each) do 6 @user = create(:user) 7 end 8 9 it 'ユーザー一覧取得' do 10 get '/api/v1/users/' 11 JSON.parse(response.body) 12 # responseの可否判定 13 expect(response.status).to eq(200) 14 end 15 16 it '特定ユーザー取得' do 17 get "/api/v1/users/#{@user.id}" 18 json = JSON.parse(response.body) 19 # responseの可否判定 20 expect(json['email']).to eq(@user.email) 21 end 22 end 23end

試したこと

seed値をリセットやmigrate:resetなどは試しましたが変わりませんでした

補足情報(FW/ツールのバージョンなど)

Rails 6.0.4.4
Ruby 2.7.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

一度 docker-compose down し、再度 docker-compose up --build をしたら RSpec がローカル・CircleCI共に通りました。理由は不明。

投稿2022/06/14 06:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問