【问题标题】:How to patch shutil.move to test some method如何修补 shutil.move 以测试某些方法
【发布时间】:2012-10-17 04:16:23
【问题描述】:

我需要测试一个可以移动文件的方法。我不希望文件移动操作实际发生,我只需要知道被测方法正确调用shutil.move

修补shutil.move 以便该方法可以在不执行实际文件操作的情况下调用它的最佳方法是什么?

我是这样做的,但是很丑,我想用模拟库来做:

    real_move = ftp2email.shutil.move
    move_operations = []
    def fake_move(src, dst):
        move_operations.append((src, dst))
    ftp2email.shutil.move = fake_move

    msg_id = '/path/to/message.xml'
    self.ch.mark_message(msg_id)
    self.assertEqual(move_operations,
                        [('/path/to/message.xml', '/path/to/archived/message.xml')])

    ftp2email.shutil.move = real_move

【问题讨论】:

    标签: python testing mocking monkeypatching


    【解决方案1】:

    我已经用Mock library解决了这个问题

    @mock.patch('%s.ftp2email.shutil.move' % __name__)
    def test_mark_message(self, move_mock):
    
        self.ch.mark_message('/path/to/message.xml')
        move_mock.assert_called_with('/path/to/message.xml',
                                     '/path/to/archived/message.xml')
    

    这只是一种方法,我也可以通过“with 语句”或调用模拟方法 start 和 stop 来完成。

    【讨论】:

      【解决方案2】:

      您可以尝试使用mox,它可以做那种事情。

      来自mox recipes

      def testFoo(self):
          self.mox.StubOutWithMock(module_to_mock, 'FunctionToMock')
          module_to_mock.FunctionToMock().AndReturn(foo)
      
          self.mox.ReplayAll()
          ...
          self.mox.VerifyAll()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-05
        • 2016-02-25
        • 2012-02-13
        相关资源
        最近更新 更多