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)
我想知道我是否走在正确的道路上,或者什么是完全测试这块代码的更好选择。我觉得答案应该很简单。
你的导师很愚蠢。尽管了解控制器规范可能会很好,因为它们在遗留应用程序中无处不在,但将它们添加到新应用程序中并不是一个好习惯。
对于新的 Rails 应用程序:我们不建议将 rails-controller-testing gem 添加到您的应用程序中。Rails 团队和 RSpec 核心团队的官方建议是改为编写请求规范。请求规范允许您专注于单个控制器操作,但与控制器测试不同的是,测试涉及路由器、中间件堆栈以及机架请求和响应。这增加了您正在编写的测试的真实性,并有助于避免控制器规范中常见的许多问题。
DHH 很好地解释了测试控制器的实例变量有什么问题以及您应该做什么:
测试控制器设置了哪些实例变量是一个坏主意。这严重超出了测试应该知道的范围。您可以测试设置了哪些 cookie、返回了哪些 HTTP 代码、视图的外观或数据库发生了哪些变化,但测试控制器的内部结构并不是一个好主意。
这就是为什么assigns被提取到一个单独的宝石。这一切都归结为测试你的代码做了什么——而不是它是如何做的。
看:
| 归档时间: |
|
| 查看次数: |
1372 次 |
| 最近记录: |