如何在Python中获取依赖注入对象的per-testcase范围?

时间:2011-05-27 10:34:59

标签: python unittest2

我正在使用python-inject,python 2.6(使用unittest2)。

我们有用于测试使用注入的类,以及也使用相同值的测试用例。我们目前使用inject.appscope来“单一化”值。否则,它们将按用户实例化。

import inject

class A(object):
    '''shared data between many parts'''
    ...

class Foo(object):
    '''uses a to do stuff'''

    a = inject.attr('a', A)

    def bar(self):
        self.a.doStuff()

class TestFoo(TestCase):
    a = inject.attr('a', A)

    def setUp(self):
        self.foo = Foo()

    def testBar(self):
        self.foo.bar()
        self.assertTrue(self.a.stuffWasDone())
        self.assertFalse(self.a.stuffWasDoneTwice())

    def testBarTwice(self):
        self.foo.bar()
        self.foo.bar()
        self.assertTrue(self.a.stuffWasDoneTwice())


injector = inject.Injector()
injector.bind(A, scope=inject.appscope)
inject.register(injector)

runTests()

理想情况下,我想在每次测试后重置A,以避免交叉污染。 (目前在tearDown()中执行类似A.reset()的事情。)

inject.reqscope支持这样的事情(一组本地范围的实例),但我真的不知道在哪里调用register()& unregister()(重置注入对象缓存)。由于Foo.a可能已在setUp()中为每个人调用,因此在tearDown()Foo.__init__()中已经太晚了。

有关如何执行此操作的任何想法,还是应该使用其他方法?

1 个答案:

答案 0 :(得分:1)

您可以使用setUptearDown注册/取消注册范围,将每个测试方法调用视为新的“请求”。

通过以下更改,您的样本单元测试通过:

class TestFoo(unittest2.TestCase):

    a = inject.attr('a', A)

    def __init__(self, *n, **kw):
        unittest2.TestCase.__init__(self, *n, **kw)
        self.unit_scope = inject.reqscope

    def setUp(self):
        self.foo = Foo()
        self.unit_scope.register()

    def tearDown(self):
        self.unit_scope.unregister()

    ...

使用A绑定您的inject.reqscope实例:

injector = inject.Injector()
injector.bind(A, scope=inject.reqscope)