1

以下のコードは、目的の基底クラスである twisted.trial.unittest.TestCase が基底クラスではないため、失敗します。

from twisted.trial import unittest
from unittest import TestCase
import myapp

class Feature(TestCase):

  def setUp(self):
    self.callbackCounter = 0

  def checkCbCalled(self, expected):
      self.assertEqual(self.callbackCounter, expected)

  def testTrialCallsDeferred(self):

      d = myapp.buildFeature()
      self.addCleanup(self.checkCbCalled, expected=1)
      def cb(res):
        self.callbackCounter += 1
      d.addCallback(cb).addErrback(self.fail)
      return d           # does not fire because of 'import rules'?

もし私が言っていたら

from twisted.trial import unittest as trialut
from trialut import TestCase 

または、より良い:

from twisted.trial.unittest import TestCase

その後、テストは期待どおりに実行され、trial.unittest.TestCase は私の deferred を起動します。

これは、最近ローカルにインポートされたものが {lib/pythonX.X/unittest} で利用可能なものに取って代わったようです。sys.path またはその他の暗黙的または明示的なルールに基づくルールでなければならないことを理解しています。addCleanup への呼び出しがなく、返された遅延インスタンスが起動されなかったため、すべてのテストに合格していたため、これは少し長い間つまずきました。

いくつかのルールを破りました。読み方などをアドバイスしてください。

ありがとうマイク

4

1 に答える 1

2

これがどのように機能すると予想されるかは非常に不明ですが、Python のモジュールの動作について少なくともいくらか混乱しているようです。

ステートメントは (場合によっては)importソース ファイルからモジュールをロードし、ローカル スコープ内の名前をそのモジュール オブジェクトにバインドします。

だから、あなたがするとき:

from twisted.trial import unittest

モジュールをロードしてtwisted.trial.unittestから、ローカル名をバインドしてunittestいます。

これは、次のステートメントとは何の関係もありません。

from unittest import TestCase

モジュールをロードし、そのモジュールの属性によって参照されるオブジェクトunittestにローカル名をバインドします。TestCaseTestCase

後でサブクラス化するときTestCase

class Feature(TestCase):
    ...

TestCaseローカルスコープで名前を直接使用しています-モジュールTestCaseによって定義されたクラスを参照する名前。Twisted のモジュールもロードしているにもかかわらず、それunittestは Twisted のモジュールとはまったく関係がないことに注意してください。twisted.trial.unittestその機能を使用するには、その属性の 1 つを使用する必要があります。

コードの動作を改善するために行う変更の 1 つは、標準ライブラリunittestモジュールの使用をまったく停止することです。次の行を削除します。

from unittest import TestCase

クラス定義を次のように置き換えます。

class Feature(unittest.TestCase):

unittest標準ライブラリモジュールが Twisted モジュールの名前の一部を共有しているという事実に混乱しないでくださいtwisted.trial.unittest。これらは、異なる (類似しているが重複している場合もある) 機能を持つ異なるモジュールです。上記の例のクラス定義は、twisted.trial.unittest元の行の後に来るため、を使用しています。

from twisted.trial import unittest

標準ライブラリ(from ) ではなくTwisted TestCase(from ) を実際に使用すると、テスト メソッドが を返すときに期待する動作が得られます。これは、標準ライブラリではなく Twisted がこの機能を提供しているためです。twisted.trial.unittestTestCaseunittestDeferred

于 2012-01-06T19:12:09.533 に答える