我正在尝试编写一个包含生成器的测试类,并使用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上的属性传递之外,还有其他的解决办法吗?
为了明确起见,我知道如何在“标准”Python中分配属性。这不是我要问的。我想知道的是,如何在使用nosetests命令运行的nosetests测试中实现所需的行为。
根据坦维尔氏的建议,我可以添加一个__init__方法来初始化属性。这是一个解决方案,但它确实回答了我的问题,正如我最初提出的。
但是,我最终想要做的是在self语句上循环,修改self上属性的值,并在check方法中的self值中设置修改寄存器。添加一个__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似乎仍然有某种类型的方法级隔离由nosetest运行程序强制执行。所以我想深入了解一下到底发生了什么。是否有一种以正常方式共享self变量属性的方法?
发布于 2015-03-09 07:37:18
简单地说,答案是否定的,您不能使用类的实例变量传递状态。当命中类方法的输出时,鼻子将始终确定该方法属于哪个类,并将创建这个类的一个新实例,该实例将不具有您倾向于在当前测试生成类实例上设置的属性(请参见鼻子纹实际上可以做到这一点)。一种解决方案可能是使用类变量传递所需的信息,如下所示:
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但是我建议研究一下鼻参数化插件,它做了一些你试图在这里实现的魔术。
https://stackoverflow.com/questions/28922816
复制相似问题