You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Minitest测试Sinatra应用遇404错误,无法关联Web应用

解决Sinatra + Minitest测试时出现404的问题

嘿,我懂你现在的困扰——运行测试文件时一直拿到Sinatra的404页面,根本找不到登录页面,核心原因就是你的测试代码还没和实际的Sinatra应用关联起来!咱们一步步来搞定这个问题:

第一步:确认你的Sinatra应用是模块化结构

首先,确保你的主应用代码是继承自Sinatra::Base的模块化写法(这是Sinatra推荐的可测试结构),比如你的app.rb应该是这样:

# app.rb
class MyApp < Sinatra::Base
  get '/login' do
    # 这里是你的登录页面逻辑,比如渲染erb模板或者返回HTML
    "<h1>欢迎来到登录页面</h1>"
  end

  # 其他路由和应用逻辑...
end

第二步:修改测试文件,关联你的应用

你的测试文件需要做两个关键操作:引入你的应用类,并且告诉Rack::Test要测试哪个应用实例。修改后的test_login.rb应该是这样:

# test_login.rb
require 'sinatra/base'
require 'minitest/autorun'
require 'rack/test'
require 'minitest/spec'
require 'nokogiri'

# 引入你的Sinatra应用文件(确保路径正确,这里假设app.rb和测试文件同目录)
require_relative 'app'

class TestLogin < Minitest::Test
  # 引入Rack::Test的测试方法
  include Rack::Test::Methods

  # 必须定义这个app方法!Rack::Test会通过它获取要测试的应用实例
  def app
    MyApp # 返回你的Sinatra应用类
  end

  def test_login_page_is_accessible
    # 发送GET请求到登录路由
    get '/login'
    
    # 验证响应状态码是200(成功)
    assert_equal 200, last_response.status
    
    # 用Nokogiri检查页面内容是否符合预期
    doc = Nokogiri::HTML(last_response.body)
    assert doc.at_css('h1').text.include?('欢迎来到登录页面')
  end
end

关键知识点解释

  • 之前出现404,是因为测试代码没有指定要测试的应用,Rack::Test默认使用了一个空的Sinatra实例,自然找不到你定义的/login路由。
  • include Rack::Test::Methods是为了让测试类能使用get、post等HTTP请求方法,以及last_response这类获取响应的工具。
  • def app方法是核心:它告诉Rack::Test要测试哪个Sinatra应用,必须返回你的应用类或者实例。

额外注意事项

  • 如果你的应用用的是Sinatra经典模式(没有继承Sinatra::Base,直接写路由),那app方法改成这样:
    def app
      Sinatra::Application
    end
    
  • 确保应用文件的路径正确,如果app.rb不在测试文件同目录,要调整require_relative的路径,比如require_relative '../app'。
  • 如果你的应用有特殊配置(比如设置views目录、环境变量),可以在测试类的setup方法里初始化:
    def setup
      MyApp.set :environment, :test
      MyApp.set :views, File.expand_path('../views', __FILE__)
    end
    

现在再运行ruby test_login.rb,应该就能正常访问登录页面,不会再出现404啦!

内容的提问来源于stack exchange,提问作者Danny Sint

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:24:58