Nosetest 生成器方法行为

Nosetest Generator Method Behavior

我正在尝试编写一个包含生成器的测试 class 和 运行 带有 nosetests 的测试。但是,我对 nosetests 测试 运行ner 似乎隔离测试 class 中的方法的方式感到困惑,因此它们不共享相同的 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 上的属性传递给方法之外,是否有一些解决方法?

明确地说,我知道如何在 "standard" Python 中分配属性。那不是我要问的。我想知道的是如何使用 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 运行ner 似乎仍然强制执行某种类型的方法级隔离。所以我想更深入地挖掘以了解发生了什么。有没有办法以正常方式共享 self 变量的属性?

简短的回答是否定的,您不能使用 class 的实例变量传递状态。在点击 class 方法的 yield 后,nose 总是会找出该方法属于哪个 class 并将创建此 class 的新实例,该实例将没有您倾向于设置的属性当前测试生成 class 实例(参见 nose lines that actually do that)。一种解决方案可能是使用 class 变量来传递您想要的信息,如下所示:

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-parameterized plugin,它可以实现您在这里想要实现的一些神奇效果。