簡體   English   中英

模擬python類中的屬性以進行單元測試

[英]Mock an attribute in python class for unit testing

我想在單元測試中模擬self.var ,因為名稱服務器查找失敗。 我已經嘗試使用patch ,但是無法正常工作。 模擬self.var的最佳方法是什么?

我的班級定義如下:

class A:
   def __init__(self):
       self.var = Pyro4.Proxy(self.ns.lookup(temp_name))
   def method_1(self):
   .....

我的單元測試如下:

class TestA(TestCase):
    def setUp(self):
        self.temp_A = classA()    
    def test_method(self):
       self.temp_A.method_1()`

您可以在這里做兩件事,最簡單的就是修補Pyro4.Proxy,如下所示:

from unittest.mock import patch
# or from mock import create_autospec if you are in py2

class TestA(TestCase):
  @patch('Pyro4.Proxy', autospec=True)
  def test_method(self):
     temp_A = A()
     temp_A.method_1()

訣竅是修補“正確的對象”,直到實例化之后再實例化該類(在您的測試函數內部), Pyro4.Proxy是我可以從您的代碼中推斷出的最佳對象,但是如果您的class A在my_module中,也許最好的修補對象是my_module.Pyro4.Proxy

您可能想要做的另一件事就是模擬var變量。 然后在__init__方法中定義self.var並假設您不想模擬整個__init__方法,則可以

from unittest.mock import create_autospec
# or from mock import create_autospec if you are in py2

class TestA(TestCase):
  def setUp(self):
     self.temp_A = classA()
     self.temp_A.var = create_autospec(Pyro4.Proxy)(None)

  def test_method(self):
     self.temp_A.method_1()

如果您可以稍微重構一下類,我建議您將var設為易於模擬的屬性

class A(object):
   def __init__(self):
         ...
   @property
   def var(self):
       return Pyro4.Proxy(self.ns.lookup(temp_name))

   def method_1(self):
       .....

然后你的測試課可以是

from unittest.mock import create_autospec, PropertyMock
class TestA(TestCase):
  def setUp(self):
     self.temp_A = classA()
     type(self.temp_A).var = PropertyMock(side_effect=lambda *x, **y: create_autospec(Pyro4.Proxy)(*x, **y))

  def test_method(self):
     self.temp_A.method_1()

我認為處理此問題的最簡單方法是取消類測試。

在測試文件中

class AStub(A):
   def __init__(self):
     #  By pass super constructor
     self.var = None

class TestA(TestCase):
  def setUp(self):
    self.helper = AStub()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM