Python unittest 模拟补丁对象不是方法

标签 python python-2.7 unit-testing mocking python-unittest

我在使用 Python 中的 Mock 进行单元测试时遇到了麻烦。我在要测试的类中有一个方法 start_thing():

class ComplexClass:
   def __init__(self, lots, of, args):
       self.lots = lots
       ..

   def start_thing(self):
        import pdb; pdb.set_trace()
        print "some error!!"
        assert False

它所属的类非常复杂,并且很难手动尝试和模拟。这就是我开始考虑使用 Mock 的原因。

我想设置一个 mock 来模拟这个类的一个实例,以便于运行单元测试,但不模拟方法 start_thing() 以便真正的 start_thing( ) 实现已经过测试,不是模拟版本..所以我创建了这个:

class TestComplexClass(TestCase):
     @patch.object(module.ComplexClass, 'start_thing')
     def test_start_thing(self, mock_method):
        ComplexClass.start_thing()

当运行我的测试时,在我的真实方法 start_thing() 中没有命中调试跟踪、断言或打印,这表明我已经模拟了类和方法 - 我只想模拟对象并测试真正的方法。我在这里做错了什么?这可能吗?

我发现了很多 Mock 示例,展示了如何创建我想要测试的方法的模拟版本,我认为这有点毫无意义,因为我不想检查它是否被正确调用,而是我想要在真实代码中测试实现,并模拟它所属的类,以便更容易创建。

也许我对整个 Mock 测试想法有一些不理解的地方?

最佳答案

我不认为你想模拟那个类,而是想把它 stub ,例如:

class ComplexClassStub(ComplexClass):
  def __init__(self):
    self.lots = None
    self.the_rest_of_the_args = None # Now your complex class isn't so complex.

class ComplexClassTest(unittest.TestCase):
  def Setup(self):
    self.helper = ComplexClassStub()

  def testStartThing(self):
    with mock.patch.object(self.helper, 'SomethingToMock') as something_mocked:
      expected = 'Fake value'
      actual = self.helper.start_thing()
      self.assertEqual(expected, actual)
      something_mocked.assert_called_once_with()

关于Python unittest 模拟补丁对象不是方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32684810/

相关文章:

c# - "ToDictonary"在模拟对象上使用时抛出异常

javascript - 测试同一函数的并发调用

python - 如何在 python 中发送带有请求的 “multipart/related”?

python - 如何从 Python 异步运行外部命令?

python - 在python中读取yaml文件的行 block 并对其进行排序

python-2.7 - 错误:(-5) 图像为空或函数 cv::SIFT::operator () 中的深度不正确 (!=CV_8U)

android - 在 Android Studio 中运行参数化单元测试时,没有找到给定的测试包括错误

python - 如何使用 matplotlib 从三个不同的数据框中绘制条形图?

python-2.7 - Selenium Python 运行多个测试用例如何登录一次并使用相同的实例浏览器

linux - 导入错误 : No module named multipart