【发布时间】:2018-06-15 05:04:10
【问题描述】:
我有一些试用单元测试。在我的代码库中,一些方法返回延迟并添加回调,而其他方法则用@inlineCallbacks 装饰。我想在没有反应器的情况下运行测试,因为某些方法不执行任何 I/O。我坚持@inlineCallbacks 只是返回一个延迟,所以调用 callbacks(0) 来触发它就足够了。似乎并非如此。这是一个最小的例子:
from twisted.trial import unittest
from twisted.internet.defer import inlineCallbacks, returnValue, Deferred
def addone(val):
d = Deferred()
def cbk(res):
return val + 1
d.addCallback(cbk)
return d
@inlineCallbacks
def call_addone(val):
res = yield addone(val)
returnValue(res)
class Tester(unittest.TestCase):
def test_addone(self):
d = addone(2)
d.callback(0) # whatever I pass is ignored
self.assertEqual(3, self.successResultOf(d))
def test_call_addone(self):
d = call_addone(4)
d.callback(0) # whatever I pass is set as deferred's result
self.assertEqual(5, self.successResultOf(d))
当我调用 addone(2) 时,我会返回一个 deferred,当我使用 callback(0) 触发它时将返回 2+1。在这种情况下,传递给回调的值将被忽略。 在第二个测试 call_addone(4) 也返回一个 deferred。但在这种情况下,传递给它的参数将被忽略,而返回值将是我传递给回调()的任何值。为什么?我显然错过了一些东西。
这是试用运行器的输出:
test_trial
Tester
test_addone ... [OK]
test_call_addone ... [FAIL]
===============================================================================
[FAIL]
Traceback (most recent call last):
File "tests/test_trial.py", line 31, in test_call_addone
self.assertEqual(5, self.successResultOf(d))
File "/home/b/.local/share/virtualenvs/twproba-y019OThE/lib/python3.5/site-packages/twisted/trial/_synctest.py", line 432, in assertEqual
super(_Assertions, self).assertEqual(first, second, msg)
File "/usr/lib/python3.5/unittest/case.py", line 821, in assertEqual
assertion_func(first, second, msg=msg)
File "/usr/lib/python3.5/unittest/case.py", line 814, in _baseAssertEqual
raise self.failureException(msg)
twisted.trial.unittest.FailTest: 5 != 0
test_trial.Tester.test_call_addone
-------------------------------------------------------------------------------
Ran 2 tests in 0.029s
FAILED (failures=1, successes=1)
【问题讨论】:
标签: python twisted deferred trial