【问题标题】:How to restrict users from calling specific methods如何限制用户调用特定方法
【发布时间】:2015-06-19 02:04:22
【问题描述】:

我有一个包含一堆方法的类,我为每个方法编写了单元测试。类中的主要方法是encrypt 方法,它接收一条消息并对其进行加密。我还写了这个 encrypt 方法使用的 5 个其他方法,但我不希望用户能够调用这些方法,我只想在 encrypt 方法中使用它们来完成工作,但我不希望用户像@obj.some_method_that_is_not_encrypt 那样做,我只想使encrypt 方法可调用,我知道我可以将这些方法设为私有,但是我的单元测试将失败。我该如何处理这个问题?

【问题讨论】:

  • 看这里stackoverflow.com/questions/267237/…你可以使用send绕过私人。
  • @Doon 但这不是很臭吗?
  • 气味判断留给读者作为练习:) 它打开了一个全新的蠕虫罐。但是,您(或您的班级)用户可以执行此操作并绕过私有这一事实意味着无论如何都应将私有视为建议。但可惜我没有一个好的答案。我通常测试类的公共接口/行为而不是每个函数,无论是对还是错。

标签: ruby


【解决方案1】:

您的单元测试可以使用Object#send(...) 来调用私有方法:

class Foo
private
  def bar
    "ok"
  end
end

f = Foo.new
f.bar # => NoMethodError: private method `bar' called...
f.send(:bar) # => "ok"

因此,您的“加密”方法可能是唯一的公共方法,但它仍然可以使用不暴露给您图书馆的礼貌用户的私有方法(他们当然可以使用send如果他们愿意,也可以)。

还要注意,“私有”方法的一个特殊方面是它们不能用显式接收器调用,即使在同一个类中也是如此。所以你不能打电话给self.my_private_method,而只能打电话给my_private_method。例如:

class Foo
  def foo
    self.bar # => NoMethodError: private method `bar' called...
    bar # => "ok"
  end
private
  def bar; "ok"; end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 2011-06-22
    • 2018-11-11
    • 2012-04-04
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多