1

假设我有以下测试类:

# 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()

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

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

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

4

1 回答 1

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 的一部分。

于 2013-09-24T18:30:24.990 回答