1

質問は見出しと同じですが、スレッド実行機能をテストするためにselect.selectサンプルをどうやって模擬することができますか? テスト機能はスレッド内で組み込みモジュールをモックする方法

ready = select.select([self.sock], [], [], 5) 
TypeError: fileno() returned a non-integer 

で失敗し、タイプのプリントは「builtin_function_or_method」テストでそれがある一方で、スレッドのスコープに嘲笑されていないselect.selectのではっきり

種類を提供します。.. (アサートでisinstance)別のモジュールに次のように

import select 
import threading 

RECEIVE_BYTES = 256 


class Bar(threading.Thread): 
    def __init__(self, sock): 
     threading.Thread.__init__(self) 
     self.sock = sock 

    def run(self): 
     print type(select.select) 
     ready = select.select([self.sock],[],[],5) 
     if ready[0]: 
      print self.sock.recv(RECEIVE_BYTES) 

テストが

回の
def test_run(self): 
    with patch("select.select"): 
     select.select.return_value = [True] 
     mock_sock = MagicMock() 
     foo = Bar(mock_sock) 
     assert isinstance(select.select, MagicMock) 
     foo.start() 

テストが鼻

短い答えは、スレッドが with patch(...)ブロックを離れる前に終了するのを待つために foo.join()を呼び出すことです

答えて

1

経由で実行されます。このエラーは、スレッドが終了する前にパッチを削除することによって発生しています。

ちなみに、実行可能なサンプルを投稿すると、人々が手助けする方がはるかに簡単です。あなたの例は不完全で、構文エラーがありました。

ここでは修正されたテストがあります。エラーを再現しやすくするためにループを追加しました。

import select 
from mock import patch, MagicMock 
from time import sleep 

from scratch import Bar 

IS_FIXED = True 

def test_run(): 
    for _ in range(20): 
     with patch("select.select"): 
      select.select.return_value = [True] 
      mock_sock = MagicMock() 
      foo = Bar(mock_sock) 
      assert isinstance(select.select, MagicMock) 
      foo.start() 
      if IS_FIXED: 
       foo.join() 
     sleep(0.1) 

次に、Barクラスのシンタックスフィックスを示します。

import select 
import threading 

RECEIVE_BYTES = 256 


class Bar(threading.Thread): 
    def __init__(self, sock): 
     threading.Thread.__init__(self) 
     self.sock = sock 

    def run(self): 
     print type(select.select) 
     ready = select.select([self.sock],[],[],5) 
     if ready[0]: 
      print self.sock.recv(RECEIVE_BYTES) 
+0

awesome thx私の構文の問題を調整します... – studioj

関連する問題