1

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()`
4

2 回答 2

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 变量。然后当您在方法self.var内部定义__init__并假设您不想模拟整个__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()
于 2016-10-27T06:01:43.973 回答
0

我认为处理这个问题的最简单方法是剔除被测类。

在测试文件中

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

class TestA(TestCase):
  def setUp(self):
    self.helper = AStub()
于 2016-10-27T21:41:42.010 回答