1

sqlalchemy コードを単体テストしようとしています。

    def add_user(*user_details):
         try:
             u = User(*user_details)
             session.add(u)
             session.commit()
         except:
             session.rollback()

今私の単体テストで:

    def testDuplicate(self):
         add_user(user_detail1,user_detail2)
         self.assertRaises(IntegrityError, add_user(user_detail1,user_detail2))

add_user 関数呼び出しで整合性エラーが発生した場合、このテストは成功し、例外がない場合は失敗します。しかし問題は、両方のケースでテストが成功することです。

なぜこうなった?私のコードに何か問題がありますか? または assertRaises は、私が期待しているものとは異なる動作をしますか?

最初は、try 句に except を入れており、例外はそこでのみ処理され、assertRaises は例外を取得しないため、これが起こっていると思いました。しかし、これが事実である場合、assertRaises は例外を受け取らずに失敗するはずです。

単体テストの書き方に問題がある場合は、教えてください。コーディングの習慣に単体テストを組み込むことをまだ学んでいるからです。

4

1 に答える 1

3

assertRaises を間違って使用しています。代わりに次のように記述してください。

self.assertRaises(IntegrityError, add_user, user_detail1, user_detail2)

関数と引数を別々に に与えて、関数assertRaisesがいつ呼び出されるかを制御できるようにします (たとえば、 のtry/exceptブロックでassertRaises)。

もう 1 つの問題は、テスト対象の関数がエラーを飲み込んでいるということです。試す

def add_user(*user_details):
         try:
             u = User(*user_details)
             session.add(u)
             session.commit()
         except:
             session.rollback()
             raise

これにより、例外が再発生します (ただし、トランザクションをロールバックできます)。

于 2011-11-13T16:17:23.507 に答える