【问题标题】:How do I access a virtual attribute from a gem in Rspec?如何从 Rspec 中的 gem 访问虚拟属性?
【发布时间】:2015-05-02 00:30:08
【问题描述】:

在我的Dashboard#Index 我的控制器中有这个:

tagged_nodes = Node.includes(:user_tags).tagged_with(current_user.email)    

这是我的规格:

it "assigns all the nodes that are tagged with the current_user email to local variable 'tagged_nodes'" do
  get :index
  expect(assigns(:tagged_users)).to eq Node.includes(:user_tags).tagged_with(@user.email)    
end

这是我得到的错误:

 Failure/Error: expect(assigns(:tagged_users)).to eq Node.includes(:user_tags).tagged_with(@user.email)

       expected: #<ActiveRecord::Relation []>
            got: nil

       (compared using ==)

我怀疑这是因为 tagged_with 是来自 gem acts_as_taggable_on 的辅助方法

这确实是导致此错误的原因吗?如果是这样,我该如何解决?

如果不是,是什么导致了这个错误?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rspec acts-as-taggable-on rspec3


    【解决方案1】:

    您是否尝试在您的测试之外重现此问题?如果不是,我认为这是合乎逻辑的第一步。

    我首先尝试在控制器本身中重现此问题(即,在您的控制器操作中,撒上puts 语句或插入binding.pry,如果您有出色的 Pry gem)。如果 @tagged_users 在运行开发站点时在控制器操作中正确填充,但在运行具有完全相同设置的规范时未填充,则认为这是 Rspec 问题。这归结为“消除尽可能多的变量以隔离问题”。

    【讨论】:

    • 是的。这在我的控制器中正常工作。发生的事情是我在事后添加测试。因此,控制器现在可以使用该逻辑工作,我正在尝试向后工作。
    • 啊,明白了。在这种情况下,我会推荐 pry gem。将其添加到您的 gemfile(testdevelopment 组),然后在代码中的某处添加行 binding.pry(在本例中为控制器操作)。当 Ruby 执行到该行时,它将停止并为您提供一个交互式控制台,您可以在其中查询变量、进行更改等,以确定变量未按预期填充的原因。
    • 顺便说一句,您可能知道 TDD/BDD,这两者都鼓励您在编写相应实现之前编写所有规范;我了解这种方法可以快速消除此类问题。不幸的是,我从来没有得到 BDD 的“啊哈”时刻,发现它非常乏味,所以我经常和你在同一条船上。 ;-)
    • 是的,我正在尝试使用 TDD,但第一步是向现有功能添加测试 - 这就是我在这里所做的 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2020-07-17
    相关资源
    最近更新 更多