【问题标题】:Stub specific instances of a class in a functional test功能测试中类的存根特定实例
【发布时间】:2016-05-19 12:03:17
【问题描述】:

我想测试一个特定的图标是否会显示在一个用户的视图中,该用户的连续性超过 X 天。所以我需要存根User 模型的streak 方法。但我希望它仅基于其uid 为特定用户存根该方法。测试代码如下。

test "should display an icon for users with streak longer than 7 days" do
    node = node(:one)
    User.any_instance.stubs(:streak).returns([8,10])
    get :show, 
        author: node.author.username, 
        date: node.created_at.strftime("%m-%d-%Y"),
        id: node.title.parameterize
    assert_select ".fa-fire", 1
end

返回值是一个数组,数组中的第一个值是连续的天数,第二个值是该连续的帖子数。

User.any_instance.stubs(:streak).returns([8,10]) 行存根 User 类的任何实例。我怎样才能存根它,以便它只存根 :uid => 1 的那些实例?

【问题讨论】:

  • 我不了解 Ruby,但您所描述的它创建了一个“假”,而不是一个存根。我尽量避免它们像瘟疫一样,因为从技术上讲,您必须为它们编写单元测试以确保它们的行为是可预测的。我可能没有正确理解您的问题,但我会编写两个测试并使用两个不同的存根。一个存根是:uid = 0,另一个测试将使用一个存根,其中:uid 是大于或等于1 的某个值。

标签: ruby-on-rails ruby testunit ruby-mocha


【解决方案1】:

听起来您应该对特定实例而不是类本身进行存根。

User.where.not(uid: 1).each do |user|
  user.stubs(:streak).returns([8,10])
end

或者也许(如果没有更多上下文,我不能肯定地说),你可以通过这样做来优化它:

node.author.stubs(:streak).returns([8,10])

【讨论】:

  • 我之前试过这个。它不起作用,因为在渲染页面期间使用的实例与存根实例不同。所以我们需要专门使用 uid 来存根类的实例。
猜你喜欢
  • 2019-07-27
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多