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

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

新規登録して質問してみよう
ただいま回答率
87.20%
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したいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

解決済

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したいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

1回答

0評価

0クリップ

218閲覧

投稿2022/06/01 11:25

編集2022/06/14 15:13

前提

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

実現したいこと

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

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

CircleCI

#!/bin/bash -eo pipefail bundle exec rspec $(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings) \ || (printf "====== RETRYING...\n\n\n"; bundle exec rspec --only-failures) Error reading historical timing data: file does not exist Requested weighting by historical based timing, but they are not present. Falling back to weighting by name. ..FFFFFF Failures: 1) Post Post 全ての投稿を取得 Failure/Error: get '/api/v1/posts' NoMethodError: undefined method `now' for nil:NilClass # ./spec/requests/api/v1/posts_spec.rb:11:in `block (3 levels) in <main>' 2) Post Post 特定の投稿を取得 Failure/Error: get "/api/v1/posts/#{@post.id}" NoMethodError: undefined method `now' for nil:NilClass # ./spec/requests/api/v1/posts_spec.rb:19:in `block (3 levels) in <main>' 3) Post Post 投稿編集 Failure/Error: put "/api/v1/posts/#{post.id}", params: { name: 'new-title' } NoMethodError: undefined method `now' for nil:NilClass # ./spec/requests/api/v1/posts_spec.rb:54:in `block (3 levels) in <main>' 4) Post Post 投稿削除 Failure/Error: expect { delete "/api/v1/posts/#{post.id}" }.to change(Post, :count).by(-1) NoMethodError: undefined method `now' for nil:NilClass # ./spec/requests/api/v1/posts_spec.rb:67:in `block (4 levels) in <main>' # ./spec/requests/api/v1/posts_spec.rb:67:in `block (3 levels) in <main>' 5) User User ユーザー一覧取得 Failure/Error: get '/api/v1/users/' NoMethodError: undefined method `now' for nil:NilClass # ./spec/requests/api/v1/users_spec.rb:10:in `block (3 levels) in <main>' 6) User User 特定ユーザー取得 Failure/Error: get "/api/v1/users/#{@user.id}" NoMethodError: undefined method `now' for nil:NilClass # ./spec/requests/api/v1/users_spec.rb:17:in `block (3 levels) in <main>' Finished in 0.49542 seconds (files took 2.14 seconds to load) 8 examples, 6 failures Failed examples: rspec ./spec/requests/api/v1/posts_spec.rb:10 # Post Post 全ての投稿を取得 rspec ./spec/requests/api/v1/posts_spec.rb:18 # Post Post 特定の投稿を取得 rspec ./spec/requests/api/v1/posts_spec.rb:51 # Post Post 投稿編集 rspec ./spec/requests/api/v1/posts_spec.rb:63 # Post Post 投稿削除 rspec ./spec/requests/api/v1/users_spec.rb:9 # User User ユーザー一覧取得 rspec ./spec/requests/api/v1/users_spec.rb:16 # User User 特定ユーザー取得 ====== RETRYING... To use `--only-failures`, you must first set `config.example_status_persistence_file_path`. Exited with code exit status 1 CircleCI received exit code 1

該当のソースコード

spec/factories/posts.rb

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

spec/factories/users.rb

FactoryBot.define do factory :user do name { 'testuser' } sequence(:email) { |n| "tester#{n}@example.com" } password { 'password' } password_confirmation { 'password' } end end

spec/models/post_spec.rb

require 'rails_helper' RSpec.describe Post, type: :model do it 'Creates Post' do post = create(:post, name: 'testpost') expect(post).to be_valid end end

spec/models/user_spec.rb

require 'rails_helper' RSpec.describe User, type: :model do it 'Creates User' do @user = FactoryBot.create(:user) expect(@user).to be_valid end end

spec/requests/api/v1/posts_spec.rb

require 'rails_helper' RSpec.describe Post, type: :request do describe 'Post' do before(:each) do @post = create(:post) @posts = create_list(:post, 10) end it '全ての投稿を取得' do get '/api/v1/posts' JSON.parse(response.body) # リクエスト成功を表す200が返ってきたか確認する。 expect(response.status).to eq(200) end it '特定の投稿を取得' do get "/api/v1/posts/#{@post.id}" json = JSON.parse(response.body) # リクエスト成功を表す200が返ってきたか確認する。 expect(response.status).to eq(200) # 要求した特定のポストのみ取得した事を確認する。 expect(json['name']).to eq(@post.name) end # it '新規投稿' do # post_params = { # name: 'posttest', # user_id: '1', # quickword: '早速、右下のボタンで募集ページをつくりましょう!', # catchcopy: 'ご閲覧ありがとうございます', # member: '3', # place: '集合場所', # category: '', # price: '1000', # start_time: '2000-01-01T09:00:00.000Z', # finish_time: '2000-01-01T03:00:00.000Z', # release: '2021-5-10', # } # # データが作成されている事を確認。 # expect { post '/api/v1/posts', params: post_params }.to change(Post, :count).by(+1) # # リクエスト成功を表す200が返ってきたか確認する。 # expect(response.status).to eq(200) # end it '投稿編集' do post = create(:post, name: 'old-title') put "/api/v1/posts/#{post.id}", params: { name: 'new-title' } json = JSON.parse(response.body) # リクエスト成功を表す200が返ってきたか確認する。 expect(response.status).to eq(200) # データが更新されている事を確認。 expect(json['name']).to eq('new-title') end it '投稿削除' do post = create(:post) # データが削除されている事を確認。 expect { delete "/api/v1/posts/#{post.id}" }.to change(Post, :count).by(-1) # リクエスト成功を表す200が返ってきたか確認する。 expect(response.status).to eq(200) end end end

spec/requests/api/v1/users_spec.rb

require 'rails_helper' RSpec.describe User, type: :request do describe 'User' do before(:each) do @user = create(:user) end it 'ユーザー一覧取得' do get '/api/v1/users/' JSON.parse(response.body) # responseの可否判定 expect(response.status).to eq(200) end it '特定ユーザー取得' do get "/api/v1/users/#{@user.id}" json = JSON.parse(response.body) # responseの可否判定 expect(json['email']).to eq(@user.email) end end end

試したこと

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

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

Rails 6.0.4.4
Ruby 2.7.2

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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したいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。