【问题标题】:Testing with Twisted and inlineCallbacks使用 Twisted 和 inlineCallbacks 进行测试
【发布时间】:2012-02-23 04:06:17
【问题描述】:

这是我的函数定义:

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

我想做的是使用 Twisted 的试用版来测试这个功能:

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 和试用的文件都涂红了,但找不到如何让它工作。

【问题讨论】:

    标签: python unit-testing testing twisted


    【解决方案1】:

    这里是使用@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)
    

    yavor@yavor-pc:~/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)
    

    【讨论】:

    • 谢谢雅沃尔。我没试过这样的,我去看看。但我更喜欢使用 defer.inlineCallbacks 和 yield 代替。我找不到任何例子,我不确定这是否可能..
    【解决方案2】:

    但确实如此:

    $ 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 的实现(你已经省略了)。

    【讨论】:

    • 感谢让-保罗。有趣.. 我只是省略了隐藏不必要的实现细节。如果我将 get_order 函数运行到我的服务器视图中,它会正常工作。我希望它会坏,然后很容易修复它。顺便说一句,我正在使用 Twisted 10.10..
    • 由于它使用我的get_order 实现(它确实return defer.succeed(3))可以正常工作,我认为get_order 的实现细节不是不必要的,但对于您遇到的问题很重要相遇。
    【解决方案3】:

    您的函数get_order 需要从twisted.internet.defer 返回DeferredDeferredList 的实例。

    【讨论】:

      猜你喜欢
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2013-01-20
      • 2015-05-25
      • 1970-01-01
      相关资源
      最近更新 更多