0

私は、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」メソッドでデバッグする方法

  1. これを gemfile に追加します: " gem 'launchy' "
  2. インストール: bundle install
  3. コマンド「save_and_open_page」を好きな場所に配置します

それが役立つことを願っています。:)

4

1 に答える 1

1

Capybara にはsave_pageメソッドもあり、「起動」gem を必要としないように見えるため、より簡単に使用できます。ページは に保存されtmp/capybaraます。rspec テストでは、 、、またはその他のブロックsave_page内で必ず使用してください。個別のコマンドとしては機能しません。例:beforeit

    before { visit signup_path; save_page }
于 2013-03-19T14:30:23.940 に答える