扭曲的试验在测试之间悬而未决

时间:2012-04-15 02:27:18

标签: python twisted trial

我很擅长扭曲,而且我正在尝试使用试用测试框架编写一些单元测试。我的测试按预期运行并通过,但由于某些原因,试验在测试之间悬挂。我必须在每次测试后点击 CTRL + C ,让它继续下一个。我猜我的配置不正确或者我没有调用某种方法我应该告诉试验测试已经完成。

以下是受测试的课程:

from twisted.internet import reactor, defer
import threading
import time


class SomeClass:
   def doSomething(self):
      return self.asyncMethod()

   def asyncMethod(self):
       d = defer.Deferred()
       t = SomeThread(d)
       t.start()
       return d


class SomeThread(threading.Thread):
    def __init__(self, d):
        super(SomeThread, self).__init__()
        self.d = d

    def run(self):
        time.sleep(2) # pretend to do something
        retVal = 123
        self.d.callback(retVal)

这是单元测试类:

from twisted.trial import unittest
import tested


class SomeTest(unittest.TestCase):
    def testOne(self):
        sc = tested.SomeClass()
        d = sc.doSomething()
        return d.addCallback(self.allDone)

    def allDone(self, retVal):
        self.assertEquals(retVal, 123)

    def testTwo(self):
        sc = tested.SomeClass()
        d = sc.doSomething()
        return d.addCallback(self.allDone2)

    def allDone2(self, retVal):
        self.assertEquals(retVal, 123)

这是命令行输出的样子:

me$ trial test.py 
test
  SomeTest
    testOne ... ^C                                                           [OK]
    testTwo ... ^C                                                           [OK]

-------------------------------------------------------------------------------
Ran 2 tests in 8.499s

PASSED (successes=2)

1 个答案:

答案 0 :(得分:1)

猜测你的问题与你的线程有关。 Twisted不是线程安全的,如果你需要与线程接口,你应该让反应堆使用deferToThreadcallInThreadcallFromThread来处理事情。 有关如何使用Twisted进行线程安全的信息,请参阅here