2012-02-23 7 views
2

とのテストは私の関数の定義である:私は何をしたいかここではツイストとinlineCallbacks

@defer.inlineCallbacks 
def get_order(order_id): 
    # do some db operations... 
    defer.returnValue(order_details) 

はツイストのトライアルを使用してこの機能をテストすることです:

from twisted.trial import unittest 
from twisted.internet import defer 

class OrderTest(unittest.TestCase): 
    @defer.inlineCallbacks 
    def test_order(self): 
     order = yield get_order(5) 
     raise Exception('FAIL FAIL!!') # this should fail, but never does 
     self.assertEqual(order.id, 6) 

私は非常に混乱している..私私はTwistedとtrialについて見つけ出すことができたが、この作業をする方法を見つけることができなかったすべての文書を赤で示した。

答えて

7

ここでは、@ defer.inlineCallbacksと出力の動作テストがあります。 私は最後にあなたのテストを入れました。それは例外を発生させます。

from twisted.trial import unittest 
from twisted.internet import defer 
from twisted.internet import reactor 

@defer.inlineCallbacks 
def get_order(order_id): 
    d = defer.Deferred() 
    reactor.callLater(2, d.callback, order_id) 
    result = yield d # yielded deferreds will pause the generator 

    # after 2 sec 
    defer.returnValue(result) # the result of the deferred, which is order_id 

class OrderTest(unittest.TestCase): 
    def test_order(self): 
     return get_order(6).addCallback(self.assertEqual, 6) 

# This works 
class OrderTestYourWay(unittest.TestCase): 
    @defer.inlineCallbacks 
    def test_order(self): 
     order_id = yield get_order(6) 
     defer.returnValue(self.assertEqual(order_id, 6)) 

# this fails, cause 6 != 5 
class OrderTestYourWayWithFailure(unittest.TestCase): 
    @defer.inlineCallbacks 
    def test_order(self): 
     order_id = yield get_order(6) 
     defer.returnValue(self.assertEqual(order_id, 5)) 

# This is your test 
# It raises an exception, which produces an error in the test 
class OrderTestRaisingException(unittest.TestCase): 
    @defer.inlineCallbacks 
    def test_order(self): 
     order_id = yield get_order(5) 
     raise Exception('FAIL FAIL!!') # this should fail, but never does 
     self.assertEqual(order_id, 6) 

[email protected]:~/src/tvstream/Misc/src/var$ trial OrderTest.py 

OrderTest 

    OrderTest 

    test_order ...               [OK] 

    OrderTestRaisingException 

    test_order ...              [ERROR] 

    OrderTestYourWay 

    test_order ...               [OK] 

    OrderTestYourWayWithFailure 

    test_order ...              [FAIL] 

=============================================================================== 

[FAIL] 

Traceback (most recent call last): 

    File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 1020, in _inlineCallbacks 

    result = g.send(result) 

    File "/home/yavor/src/tvstream/Misc/src/var/OrderTest.py", line 34, in test_order 

    defer.returnValue(self.assertEqual(order_id, 5)) 

twisted.trial.unittest.FailTest: not equal: 

a = 6 

b = 5 


OrderTest.OrderTestYourWayWithFailure.test_order 

=============================================================================== 

[ERROR] 

Traceback (most recent call last): 

    File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 1020, in _inlineCallbacks 

    result = g.send(result) 

    File "/home/yavor/src/tvstream/Misc/src/var/OrderTest.py", line 40, in test_order 

    raise Exception('FAIL FAIL!!') # this should fail, but never does 

exceptions.Exception: FAIL FAIL!! 

OrderTest.OrderTestRaisingException.test_order 

------------------------------------------------------------------------------- 

Ran 4 tests in 8.016s 

FAILED (failures=1, errors=1, successes=2) 
+0

ありがとうございました。私はこれを何も試していない、私は見てみましょう。しかし、私はdefer.inlineCallbacksとyieldを代わりに使用することをお勧めします。私はそれの例を見つけることができませんでした、私はそれが可能かどうかはわかりません。 – pocoa

4

しかし、それがない:

$ trial test_example.py 
test_example 
    OrderTest 
    test_order ...              [ERROR] 

=============================================================================== 
[ERROR] 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 1020, in _inlineCallbacks 
    result = g.send(result) 
    File "/tmp/test_example.py", line 11, in test_order 
    raise Exception('FAIL FAIL!!') # this should fail, but never does 
exceptions.Exception: FAIL FAIL!! 

test_example.OrderTest.test_order 
------------------------------------------------------------------------------- 
Ran 1 tests in 0.009s 

FAILED (errors=1) 
$ 

おそらく、本当の問題は、(あなたは省略しました)get_orderの実装です。

+1

ありがとうジャンポール。興味深い..私は、不必要な実装の詳細を隠すために省略しました。私はそれを私のサーバービューに実行すると、get_order関数が正常に動作します。私はそれが壊れることを望む、それはそれを修正するのは簡単です。私はTwisted 10.10を途中で使用しています。 – pocoa

+1

'get_order'の実装(' return defer.succeed(3) ')を使って正しく動作するので、' get_order'の実装の詳細は不要ではないと思いますあなたが遭遇している問題の中心です。 –

0

get_orderは、またはDeferredListのインスタンスをtwisted.internet.deferから戻す必要があります。

関連する問題