私は、Ogame のようなゲーム ( https://github.com/arnlen/ogame-like ) であるトレーニング アプリに取り組んでいます。
アプリをテストするために rspec (Capybara を使用) を使用しています。rspec が自分のブラウザで *私が再現できない* エラーを訴えているので、私は数時間スタックしています。
これが私のrspecコードです:
describe 'Planet pages' do
let(:user){FactoryGirl.create(:user)}
before {sign_in user}
subject {page}
describe "new planet page" do
before {visit new_planet_path}
describe "with valid information" do
before do
visit new_planet_path
fill_in "Name", with: "MyPlanet"
click_button "Validate"
end
# This test doesn't pass
it {should have_selector('h1', text: "Planet")}
end
end
end
失敗 :
1) Planet pages new planet page with valid information
Failure/Error: it {should have_selector('h1', text: "Planet")}
expected css "h1" with text "Planet" to return something
# ./spec/requests/planet_pages_spec.rb:34:in `block (4 levels) in <top (required)>'
関連するコードは次のとおりです。
rspecで使用される私の関数「sign_in 」 (場所:spec/support/utilities.rb)
def sign_in(user)
visit signin_path
fill_in "Email", with: user.email
fill_in "Password", with: user.password
click_button "Sign in"
end
私のユーザーコントローラー
class UsersController < ApplicationController
before_filter :signed_in_user, only: [:index, :show, :edit, :update, :destroy]
def new
@user = User.new
end
def create
@user = User.new(params[:user])
if @user.save
sign_in @user
redirect_to new_planet_path
else
render 'new'
end
[...]
My PlanetsController
class PlanetsController < ApplicationController
before_filter :signed_in_user
def index
@planets = current_user.planets
end
def new
@planet = Planet.new
end
def create
@planet = Planet.new(name: params[:planet][:name],
coordinates: generate_coordinates,
metal_ressource: 1000,
user_id: current_user.id)
if @planet.save
flash[:success] = "Welcome on your first planet!"
redirect_to action: 'index'
else
flash[:error] = "Error naming your planet"
render 'new'
end
end
end
とMy Planet Index ビュー
<% @planets.each do |planet| %>
<h1>Planet : <%= planet.name %></h1>
<p><%= "Coordinates : #{planet.coordinates}" %></p>
<% end %>
Capybara のメソッド「 save_and_open_page 」を利用しようとしたところ、rspec で「 undefined method 」というエラーが発生しました
また、スペックファイルの反復によるステップバイステップのデバッグを試みたところ、「click_button 'Validate'」の直後にエラーが発生することが明らかになりました。理由は不明ですが、rspec は Planets_path (PlanetsController からの "index" アクション) に到達できないようです。
私は出ています、誰かがアイデアを持っているなら、私はそれを取ります!
編集:解決済み - 問題が見つかりました!
Capybaraの " save_and_open_page " メソッドを使用して、何が起こっているのかを突き止めました: rspec によって作成された惑星には、モデルによって許可されていない座標がありませんでした。
素晴らしい「save_and_open_page」メソッドでデバッグする方法
- これを gemfile に追加します: " gem 'launchy' "
- インストール: bundle install
- コマンド「save_and_open_page」を好きな場所に配置します
それが役立つことを願っています。:)