3

我正在使用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()(重置注入对象缓存)。setUp()在and中 Ot 为时已晚tearDown(),因为 Foo.a 可能已经Foo.__init__()为它们中的每一个调用了。

关于如何做到这一点的任何想法,或者我应该使用不同的方法?

4

1 回答 1

1

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

通过以下更改,您的示例单元测试将通过:

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)
于 2011-06-01T01:20:43.997 回答