是否可以从鼻子插件访问类级属性?

时间:2013-09-24 18:10:54

标签: python testing plugins nose

说我有以下测试类:

# file tests.py
class MyTests(object):
    nose_use_this = True

    def test_something(self):
        assert 1

我可以轻松编写一个在该测试之前运行的插件:

class HelloWorld(Plugin):
    # snip
    def startTest(self, test):
        import ipdb; ipdb.set_trace()

测试是我想要的,但test的类型是nose.case.Test

ipdb> str(test)
'tests.MyTests.test_something'
ipdb> type(test)
<class 'nose.case.Test'>

我看不到任何可以让我获得我在TestCase-ish类中定义的nose_use_this属性的内容。

1 个答案:

答案 0 :(得分:1)

编辑:

我认为最好的方法是使用startContext / stopContext方法对访问上下文,并在那里设置实例的属性:

class MyPlugin(Plugin):
    def __init__(self, *args, **kwargs):
        super(MyPlugin, self).__init__(self, *args, **kwargs)
        self.using_this = None

    def startContext(self, context):
        if hasattr(context, 'nose_use_this'):
            self.using_this = context.nose_use_this

    def stopContext(self, context):
        self.using_this = None

    def startTest(self, test):
        if self.using_this is not None:
            do_something()

要真正健壮,你可能需要实现一堆东西,因为“startContext”被调用(至少)模块和类,但如果唯一可以设置属性的地方是在类上那么我认为这个简单的事情应该有效。它似乎对我有用。 (鼻子1.3.0和插件api版本0.10)


原:

哦,这是_context()实例上的test函数:

ipdb> test._context()
<class 'tests.MyTests'>

它确实具有预期的类级属性。我仍然愿意采用更好的方法,_让我觉得鼻子不希望我把它作为API的一部分。