我的控制器中有一个私有方法。用于某些数据库更新。我从另一个控制器方法调用此方法。它工作正常。
但是,当我尝试为该方法编写测试用例时,它在我的功能中访问(会话变量和参数)时绊倒了所有其他方法都工作正常问题仅与私有方法有关吗?
在我的功能测试设置方法中,我也在设置会话。?
我的控制器中有一个私有方法。用于某些数据库更新。我从另一个控制器方法调用此方法。它工作正常。
但是,当我尝试为该方法编写测试用例时,它在我的功能中访问(会话变量和参数)时绊倒了所有其他方法都工作正常问题仅与私有方法有关吗?
在我的功能测试设置方法中,我也在设置会话。?
您应该避免测试私有方法。拥有 public/private/protected 方法背后的“目标”是封装逻辑并使更改部分代码变得容易,而不必担心一个函数或类如何与另一个交互。
话虽这么说,如果您仍然觉得需要测试您的私有方法,那么有一些变通方法。我通过Jay Field 的博客找到了这个实用功能:
class Class
def publicize_methods
saved_private_instance_methods = self.private_instance_methods
self.class_eval { public *saved_private_instance_methods }
yield
self.class_eval { private *saved_private_instance_methods }
end
end
检查链接以获取使用详细信息,这似乎是一种快速简单的方法来做你想做的事情。
我喜欢Damien Wilson 的建议。我支持他的说法,即“应避免测试私有方法”。必要时,我声明该方法的公共版本:
class FooTest < Test::Unit::TestCase
Foo.class_eval do
def public_bar(*args, &block)
private_bar(*args, &block)
end
end
def test_bar
assert_equal 42, Foo.new.public_bar
end
end
如何针对一个子类进行测试,使您的私有(受保护)方法可以通过包装方法访问?
class Controller
protected
def your_private_method
...
end
end
class SubclassForTest < Controller
def testwrapper
your_private_method
end
end