1

Rethinkdb と Tornado を使用していますrethinkdb.set_loop_type("tornado")

サーバールートをテストするためにpython unittestsを使用しています。

これが私のユニットテスト基本クラスです:

class ServerTest(AsyncHTTPTestCase):
    def setUp(self):
        super(ServerTest, self).setUp()

    def get_app(self):
        return Application(self.routes, debug = False)

    def post(self, route, data):
        result = self.fetch("/%s" % route, method = "POST",
                                body = json.dumps(data)).body
        return json.loads(result)

    def tearDown(self):
        super(ServerTest, self).tearDown()
        conn = yield r.connect()
        yield r.db("test").table("test_table").delete().run(conn)
        conn.close()

setUp正常に動作していることに気付きましたが、そうでtearDownはありません。すべての単体テストは適切にパスしていますが、tearDown の print ステートメントは呼び出されません。

編集:私はtearDownでyieldを呼び出しているという事実に絞り込みました。

編集:@gen.coroutineをtearDownに追加すると、印刷ステートメントが表示されますが、データベースで削除は実行されません

4

1 に答える 1

4

を使用yield@gen.coroutineて関数を非同期にすると、そのインターフェイスが変更されます。呼び出し元はこの変更を認識している必要があります。unittestフレームワークはコルーチンについて何も知らないので、呼び出されるメソッドがコルーチンになることはありませんunittest

の代わりにを@gen.coroutine使用@tornado.testing.gen_testできます。これによりyield、テストや と から呼び出されるメソッドでsetUp使用できますtearDownが、setUptearDown自体は使用できません (ジェネレーターの機構は の前後で機能しないためsuper().setUp()ですsuper().tearDown()。 でヘルパー メソッドを使用し、 inなしgen_test呼び出します。 yieldtearDown

def tearDown(self):
    self.tearDownHelper()
    super(ServerTest, self).tearDown()

@tornado.testing.gen_test
def tearDownHelper(self):
    conn = yield r.connect()
    yield r.db("test").table("test_table").delete().run(conn)
    conn.close()
于 2015-10-07T12:52:33.967 に答える