【问题标题】:Ruby on Rails : how to test a controller?Ruby on Rails:如何测试控制器?
【发布时间】:2020-01-29 08:51:34
【问题描述】:

我正在学习 Ruby。 我现在正在尝试测试我的一个控制器。

我的测试文件是 myapp/test/testing.rb,而我的控制器位于 myapp/app/controllers/test_controller.rb

testing.rb的内容是

data = testController.mymethod()
puts(data)

但是在做的时候

ruby myapp/test/testing.rb

在终端,我收到警告:

Traceback(最近一次调用最后一次):myapp/test/testing.rb:6:in `': 未初始化的常量 testController (NameError)

谁能解释一下我做错了什么以及我应该怎么做?

谢谢!

【问题讨论】:

  • 为什么投反对票?
  • 看官方Rails Guides about Testing了吗?
  • “有人能解释一下我做错了什么吗” - 几乎所有内容。 testController 很可能拼写错误。 mymethod 是实例方法而不是类方法。最后,这根本不是您测试控制器的方式。
  • 好的,谢谢。好吧,我必须以某种方式学习。不好意思问...

标签: ruby-on-rails ruby


【解决方案1】:

目前接受test rails controllers 的方法是向您的应用程序发送 http 请求并编写有关响应的断言。

Rails 有 ActionDispatch::IntegrationTest,它为 Minitest 提供集成测试,Minitest 是 Ruby 标准库测试框架。不再建议在新应用程序中使用旧的方法来模拟整个框架 ActionDispatch::ControllerTest

这是控制器测试的基本“Hello World”示例:

require 'test_helper'

class BlogFlowTest < ActionDispatch::IntegrationTest
  test "can see the welcome page" do
    get "/"
    assert_select "h1", "Welcome#index"
  end
end

您还可以使用 RSpec,它是不同的测试框架,拥有大量的追随者。在 RSpec 中,您编写 request specs,它只是 ActionDispatch::IntegrationTest 之上的一个薄包装器。

【讨论】:

    【解决方案2】:

    RSpec 是在 Ruby 上专门为此目的编写的 DSL。您必须熟悉它才能编写代码测试。至于 RSpec 团队说明: `

    Rails 团队和 RSpec 核心团队的官方建议是改为编写请求规范。请求规范允许您专注于单个控制器操作,但与控制器测试不同的是,它涉及路由器、中间件堆栈以及机架请求和响应。这增加了您正在编写的测试的真实性,并有助于避免控制器规范中常见的许多问题。在 Rails 5 中,请求规范明显快于 Rails 4 中的请求或控制器规范。

    所以你必须为你的控制器写requestspecs。像这样的东西: spec/controllers/users_controller_spec.rb

    RSpec.describe "Test", type: :request do
      describe "request list of all tests" do
        user = User.create(email: 'test@user.com', name: 'Test User')
        get users_path
        expect(response).to be_successful
        expect(response.body).to include("Test User")
      end
    end
    

    类似的东西。希望对你有帮助

    【讨论】:

    • 这个答案有很多错误之处。 Rails 一直官方支持首先测试单元,然后是 minitest。 RSpec 是通用的 BDD 框架,并不是“专门为此目的在 Ruby 上编写的”,除非您只是指一般的测试。 rspec-rails 也一直只是 Rails 用于 minitest/testunit 的测试用例类的一堆包装器。不要误会我的意思——我喜欢 RSpec。但是在 2020 年,将 RSpec 称为“编写 RoR 测试的方式”并不是那么正确。
    • 我认为它仍然是 Rails 测试的最佳介绍 - rspec。我们已经这样做了 ^ 十年了,一切都很好。问题是由一个新手提出的,所以他可能想要一些简单的东西,然后再深入了解(非 Rails)红宝石。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多