我正在尝试编写一个包含生成器的测试类,并使用nosetests
运行测试。但是,我对nosetests
测试运行器似乎隔离测试类中的方法以使它们不共享self
的方式感到困惑:
class Test(object):
def check(self):
print self.one
def test(self):
self.one = 1
yield self.check
这给了我以下错误:
AttributeError: 'Test' object has no attribute 'one'
我猜这与鼻子相互隔离测试有某种关系。是否有一些解决方法,除了将所有必需的变量显式地传递给方法而不是隐式地作为self
上的属性?
要清楚,我知道如何在"标准"中分配属性。蟒蛇。那不是我要问的。我想知道的是如何使用nosetests
命令在nosetests
测试运行中实现所需的行为。
根据Tanveer's建议我可以添加__init__
方法来初始化属性。这是一种解决方法,但它确实回答了我最初提出的问题。
然而,我最终想要做的是循环使用yield语句,修改self
上属性的值,并在self
中使用check
的值修改注册} 方法。添加__init__
并不允许我这样做。
class Test(object):
def __init__(self):
self.one = None
def check(self):
print self.one
def test(self):
self.one = 1
yield self.check
我明白了:
$ nosetests nosetest-with-classes.py --nocapture
None
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
似乎还有某种类型的方法级别隔离由nosetests运行器强制执行。因此,我想更深入地了解一下发生了什么。有没有办法以正常方式在self
变量上共享属性?
答案 0 :(得分:2)
简短的回答是否定的,你不能使用类的实例变量来传递状态。在为类方法命中yield时,nose将始终确定该方法属于哪个类,并将创建此类的新实例,该实例将没有您倾向于在当前测试生成类实例上设置的属性(请参阅{{3} })。一种解决方案可能是使用类变量来传递您想要的信息,如下所示:
class Test(object):
def check(self):
print self.one # here it really refers to Test.one
def test(self):
Test.one = 1
yield self.check
但我会建议调查nose lines that actually do that,它会做一些你想要在这里实现的魔法。