“预计css ......返回一些东西”:rspec失败,而手工测试工作(不能自己重现失败)

时间:2012-08-10 14:30:43

标签: ruby-on-rails-3 rspec capybara

我正在开发一款类似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)>'

这是涉及的代码。

我的函数“ sign_in ”由rspec 使用(位置: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

我的 UsersController

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
 [...]

我的 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

我的星球指数视图

<% @planets.each do |planet| %>
    <h1>Planet : <%= planet.name %></h1>
    <p><%= "Coordinates : #{planet.coordinates}" %></p>
<% end %>

我尝试使用Capybara方法“ save_and_open_page ”,但是rspec引发了错误“未定义的方法”

我还尝试通过我的spec文件上的迭代逐步调试,并且显示错误发生在“click_button'Veridate'”之后。由于未知原因,rspec似乎无法到达planets_path(来自PlanetsController的“index”操作)。

我出去了,如果有人有想法,我就接受了!


编辑:已解决 - 发现问题!

使用Capybara的“ save_and_open_page ”方法,我弄清楚发生了什么:由rspec创建的行星没有任何坐标,模型不允许这样做。


如何使用精彩的“save_and_open_page”方法进行调试

  1. 将此内容添加到您的gemfile中:“ gem'statey'
  2. 安装:捆绑安装
  3. 将命令“ save_and_open_page ”放在任何地方

  4. 希望它可以提供帮助。 :)

1 个答案:

答案 0 :(得分:1)

Capybara还有一个save_page方法,它更容易使用,因为它似乎不需要&#34; launchy&#34;宝石。页面保存在tmp/capybara中。在rspec测试中,请务必在save_pagebefore或其他块中使用it。它不能作为单独的命令工作。示例:

    before { visit signup_path; save_page }