如何限制用户调用特定方法

时间:2015-04-13 16:51:51

标签: ruby

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

1 个答案:

答案 0 :(得分: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"

所以你的#34;加密"方法可能是唯一的公共方法,但它仍然可以使用未向您的库的礼貌用户公开的私有方法(当然,如果他们愿意,他们也可以使用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