【问题标题】:RoR and RSpec: How to access controller instance variables without defining accessors?RoR 和 RSpec:如何在不定义访问器的情况下访问控制器实例变量?
【发布时间】:2009-07-16 13:50:05
【问题描述】:

我正在为我的控制器编写 rspec 测试,但我找不到以下问题的解决方案。 对于其中一个边缘案例测试,我需要验证一个实例变量的值。 如何在无需定义访问器的情况下访问它? 默认情况下:

controller.variable.should == '3.15' 

不起作用。

定义

attr_reader:变量

仅仅为了让测试通过是愚蠢的,而且 我确信有一种更智能的方式。

【问题讨论】:

    标签: ruby-on-rails controller rspec


    【解决方案1】:
    controller.instance_variable_get(:var)
    

    如果您发现自己正在这样做,您可能需要重新考虑您的信息隐藏方法,以便您测试基本行为而不是附带的实施细节。您的测试应确保“事物”按应有的方式发挥作用,而不会过于紧密地绑定到特定的实现。

    编辑:assigns(:var) 不是使用控制器做同样事情的 Rails 测试魔法吗?

    【讨论】:

    • 是的,你可能是对的——我应该测试操作的结果而不是实现细节。还是谢谢。
    • 公平地说,对于控制器来说,实例变量是应该被测试的东西。我在喝咖啡之前回答了这个问题。
    • 这个问题与我正在做的事情并不真正相关,只需要检查控制器的实例变量是否存在。 @BenHughes,您的回答(以及随后的回答)帮助很大。谢谢。
    • 使用assigns(这是一种免费方法,而不是controller.assigns),因为instance_variable_get 可能比assigns 有更多限制。例如:'event' is not allowed as an instance variable name,但assigns 检测到@event 没有任何问题。
    • @BenHughes,谢谢,这很容易解决,但我会指定 controller.instance_variable_get(:@var) 和 assigns(:var)
    猜你喜欢
    • 2015-12-14
    • 2012-03-10
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2015-11-15
    相关资源
    最近更新 更多