在Python中,如何编写可以访问私有属性而不暴露它们的单元测试?

时间:2011-11-08 15:27:14

标签: python unit-testing testing tdd access-modifiers

我正在努力改进我为Python程序编写单元测试用例的方法。我注意到在某些情况下,访问私有成员以确保方法正常运行会非常有帮助。一个示例案例是在尝试测试方法以确定没有预期返回值而非None的正确行为时。我知道这样做的简单方法就是将私有属性改为受保护属性,并直接测试它们。但是,我想找到一种不会暴露界面的方法。

那么我如何测试类中的私有属性而不在接口中公开它们,或者,如果适用的话,更好的方法是测试这样的场景,以便正确的单元测试不一定需要私有属性访问?

2 个答案:

答案 0 :(得分:20)

Python中没有任何内容。如果在成员变量上使用双下划线前缀,则名称将被简化。您可以通过在_Class__member表单中限定名称来访问它。这将访问班级__member中的Class变量。

另请参阅此问题:Why are Python's 'private' methods not actually private?

答案 1 :(得分:4)

我会朝不同的方向走......

尝试编写断言私有状态的公共行为的单元测试。让我们假设您调用修改内部状态的void方法A()。现在,如果调用该方法并且状态确实发生了变化,那么在您的小代码世界中将会有一些可观察到的变化。也许B()现在表现不同。所以我的测试将是......(使例子无足轻重)

void MyTest()
{
   Assert.That(B(), Is.False);
   A();
   Assert.That(B(), Is.True);
}

在测试和SUT之间避免Inappropriate Intimacy