我正在使用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__()
中已经太晚了。
有关如何执行此操作的任何想法,还是应该使用其他方法?
答案 0 :(得分:1)
您可以使用setUp
和tearDown
注册/取消注册范围,将每个测试方法调用视为新的“请求”。
通过以下更改,您的样本单元测试通过:
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)