12

例外が発生したことを主張するトライアルテストケースを作成する方法を理解しようとしています。

現在、テストする簡単な方法が2つあります(成功と失敗)。各メソッドは、すでにコールバックまたはエラーバックされた遅延を返します。成功方法のテストは正常に機能します。失敗メソッドをテストするとき、例外が発生したことをアサートできると期待しています(assertRaisesを使用)。

ただし、テストケースは失敗し、次のようになります。

twined.trial.unittest.FailTest:ConnectionRefusedErrorは発生しません(<0x920e28cで延期されました現在の結果:<twisted.python.failure.Failure <class'twisted.internet.error.ConnectionRefusedError' >>>が返されました)

コードは次のとおりです。

ツイスト.trial.unittestからインポートTestCase
twint.internet.deferからinlineCallbacksをインポートし、成功し、失敗します
ツイスト.internet.errorからインポートConnectionRefusedError

クラスMyObject:
    def success(self):
        成功を返す(True)

    def failure(self):
        fail(ConnectionRefusedError())を返します


クラスTestErrBack(TestCase):
    def setUp(self):
        self.o = MyObject()

    @inlineCallbacks
    def test_success(self):
        結果=yieldself.o.success()
        self.assertTrue(結果)

    @inlineCallbacks
    def test_failure(self):
        #このテストケースは失敗しています!
        self.assertRaises(ConnectionRefusedError、self.o.failure)を生成します

test_failureで正しいアプローチを使用していますか?私はtry...catchを使用してself.o.failureの呼び出しを回避できますが、このアプローチはassertRaisesを使用するほど良いとは思いません。

4

1 に答える 1

14

TestCase.assertFailure代わりに使用してください:

yield self.assertFailure(self.o.failure(), ConnectionRefusedError)

Twisted 12.3以降、TestCase.failureResultOfヘルパーもあります。

self.failureResultOf(self.o.failure()).trap(ConnectionRefusedError)

また、13.1以降、このAPIは追加の引数を取り、型チェックを実行します。

self.failureResultOf(self.o.failure(), ConnectionRefusedError)

これは、がすでに実行されて結果が出ていることがわかっているテストに役立ちます。呼び出し時に失敗の結果がないDeferred場合は、失敗を返す代わりに、テスト失敗の例外を発生させます。DeferredfailureResultOf

これはサンプルコードで正常に機能し、ほとんどの単体テストに適用できるはずです。トライアルを使用して、実際の非同期作業が行われている機能テストまたは統合テストを作成していて、いつ起動するかわからない場合はDeferred、最初のAPIを使用する必要がありますassertFailure

于 2012-03-23T20:15:24.137 に答える