如何测试控制器中的实例变量?

air*_*ine 1 ruby testing unit-testing rspec ruby-on-rails

我的几个导师告诉我用控制器规范测试一段代码,即使内容正在通过一些请求规范进行测试。我想知道是否可以测试是否@user可以在 rspec 控制器测试中设置someObject或设置实例变量nil

到目前为止,我已经尝试了几种不同的方法来测试这个,但我在 rspec 测试方面的技能至少可以说是初级的。我尝试的第一件事是模拟 current_user 和 'User.get_from_auth_user(current_user)。模拟对象打印良好并输出。问题是......我希望能够说出类似的话,expect(@user).to equal(mockedUser)但这似乎永远不会奏效。我总是得到类似的东西:

Expect does not equal received
expected is nil
received is { someMockedObject }
Run Code Online (Sandbox Code Playgroud)

这是我要测试的代码。

class ApplicationController < ActionController::Base
  before_action :set_user

  def set_user
    return if current_user.nil?

    @user = User.get_from_auth_user(current_user)
  end
end
Run Code Online (Sandbox Code Playgroud)

我想知道我是否走在正确的道路上,或者什么是完全测试这块代码的更好选择。我觉得答案应该很简单。

max*_*max 5

你的导师很愚蠢。尽管了解控制器规范可能会很好,因为它们在遗留应用程序中无处不在,但将它们添加到新应用程序中并不是一个好习惯。

对于新的 Rails 应用程序:我们不建议将 rails-controller-testing gem 添加到您的应用程序中。Rails 团队和 RSpec 核心团队的官方建议是改为编写请求规范。请求规范允许您专注于单个控制器操作,但与控制器测试不同的是,测试涉及路由器、中间件堆栈以及机架请求和响应。这增加了您正在编写的测试的真实性,并有助于避免控制器规范中常见的许多问题。

DHH 很好地解释了测试控制器的实例变量有什么问题以及您应该做什么:

测试控制器设置了哪些实例变量是一个坏主意。这严重超出了测试应该知道的范围。您可以测试设置了哪些 cookie、返回了哪些 HTTP 代码、视图的外观或数据库发生了哪些变化,但测试控制器的内部结构并不是一个好主意。

这就是为什么assigns被提取到一个单独的宝石。这一切都归结为测试你的代码做了什么——而不是它是如何做的。

看:

  • 我真的不认为你的导师是傻子。他们可能只是脱离了当前的最佳实践。如果您需要有关如何编写测试的更具体建议,那么我会提出一个新问题并描述您想要测试的应用程序行为。 (2认同)
  • 我的乐观态度是,这只是他的导师给他的一次学习练习,以便更好地理解 RSpec/Rails 的工作原理,特别是考虑到他已经承认这些测试并没有真正做任何有用的事情,因为它们已经被集成规范所覆盖。 。 (2认同)