【问题标题】:Acceptance testing of sinatra app using webrat fails使用 webrat 对 sinatra 应用程序的验收测试失败
【发布时间】:2012-06-17 04:11:49
【问题描述】:

我正在尝试使用 minitest 和 webrat 测试 ruby​​ 身份验证应用程序,但出现错误。

visit '/' 之类的测试因错误 Status 200 expected but was 404. 而失败

包含 fill_in :email, :with => "first@company.com" 之类的代码的测试失败并出现错误 Could not find field: :email

我阅读了几个 sinatra、测试和 webrat 文档和论坛。其中一些是旧的,建议使用 Sinatra::Default 之类的东西,但 github.com/brynary/webrat/wiki/sinatraBuilding a Sinatra App Driven By Webrat TestsLearning From the Masters: Sinatra Internals 是新的,但它们仍然失败。

基本上,我不喜欢 rspec、cucumber 等类似句子的语法,但我想做行为驱动的开发。我真的很喜欢 minitest 语法,包括测试和输出,这就是为什么我选择 webrat 作为 BDD。如果我对期望 webrat 满足验收测试要求有误,请告诉我应该使用这个框架还是那个框架。

除此之外,主文件和测试文件的第一部分如下。我希望有人能解释我,我错过了什么?

测试文件

require "test/unit"
require "minitest/autorun"
require "rack/test"
require 'webrat'
require_relative "../lib/kimsin.rb"

Webrat.configure do |config|
  config.mode = :rack
end

ENV["RACK_ENV"] = "test"

class KimsinTests < Test::Unit::TestCase
  include Rack::Test::Methods
  include Webrat::Methods
  include Webrat::Matchers

  def app
    Sinatra::Application.new
  end

  def test_create_user
    visit "/user/new"
    fill_in :username, :with => "first@company.com"
    fill_in :password, :with => "abC123?*"
    fill_in :confirm_password, :with => "abC123?*"
    click_link "Register"
    assert 201, last_response.status, "Status 201 expected but was #{last_response.status}.\n#{error}"
    assert_contain /Logged in as first@company.com./, "No user created"
    assert_contain /Logout/, "Logout link not present"
  end

main_file

require "sinatra"
require "erb"
require_relative "../lib/kimsin/version"
require_relative "../lib/kimsin/user"

class Kimsin < Sinatra::Application
  use Rack::Session::Pool, :expire_after => 2592000
  set :session_secret, BCrypt::Engine.generate_salt

  configure :development do  
    DataMapper.auto_migrate!  
  end

  get "/" do
    if session[:user_id]
      user = User.get session[:user_id]
      email = user.email
      erb :index, :locals => { :email => email }
    else
      email = nil
      erb :index, :locals => { :email => email }
    end      
  end

【问题讨论】:

    标签: ruby sinatra webrat acceptance-testing minitest


    【解决方案1】:

    将 Sinatra 与 Webrat 一起使用应该可以正常工作。我认为您看到的错误是由以下方法引起的(在您的测试文件中的第 18 行左右):

    def app
      Sinatra::Application.new
    end
    

    这是设置 Sinatra::Application 基类以在您确实需要设置自己的子类 Kimsin(因为您正在创建模块化风格的 Sinatra 应用程序)时运行测试,即

    def app
      Kimsin.new
    end
    

    发生 404 错误和缺少字段是因为 Sinatra::Application 没有定义您正在测试的任何路由。

    如果您正在寻找 Webrat 的类似替代品,您可能还想看看 Capybara

    【讨论】:

    • 谢谢你,这肯定启动了应用程序,因为访问网址现在可以工作了。但我仍然收到Could not find field: :emailCould not find link with text or title or id "Login" 之类的错误。我也用 Capybara 检查了它,它有自己的错误,我在相关问题上添加了它们。我应该提供更多信息或文件以获得有关此方面的帮助吗?
    • 我没有看到您正在进行的fill_inclick_link 调用有任何问题,因此似乎有其他问题出现了,并且这些元素确实不存在。调试此类问题的一种快速方法是在测试中的失败行之前调用save_and_open_page,以便您可以在失败点看到网页。这通常会揭示一个错误。您需要安装 launchy gem 才能完成这项工作。
    • save_and_open_page 效果很好。他们告诉我,如果之前没有用户注册,我的 session[:errors] 会导致登录页面出现问题。我不会意外注意到这一点,因为我的测试顺序很严格(获取索引、注册新用户、注册错误用户/密码、登录用户等)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2012-08-30
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多