Nosetest发电机方法行为

时间:2015-03-08 03:41:02

标签: python generator nosetests

我正在尝试编写一个包含生成器的测试类,并使用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变量上共享属性?

1 个答案:

答案 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,它会做一些你想要在这里实现的魔法。