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.reqscoperegister()このようなもの(ローカルスコープのインスタンスのセット)をサポートしますが、 &unregister()(インジェクションオブジェクトキャッシュをリセットする)をどこで呼び出すかは本当にわかりません。Foo.aがすでにそれぞれに呼び出されている可能性があるため、Otは遅すぎsetUp()ます。tearDown()Foo.__init__()

これを行う方法についてのアイデアはありますか、それとも別のアプローチを使用する必要がありますか?

4

1 に答える 1

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