代码之家  ›  专栏  ›  技术社区  ›  joedborg

模拟子流程。Popen未执行

  •  2
  • joedborg  · 技术社区  · 7 年前

    我正在尝试为调用 subprocess.Popen . 我想测试的是 arg 参数发送到 Popen 与预期一致。我其实不想 波本 运行。这是否可以不嘲弄 arg参数 列表

    例如

    def call_something(argument_list):
        binary = '/opt/mybin/'
        Popen([binary] + argument_list)
    

    然后,进行测试。

    @mock.patch('subprocess.Popen')
    def test_call_something(self, mock_popen):
        binary = '/opt/mybin/'
        args = ['foo', 'bar']
    
        mock_popen.return_value.returncode = 0
        mock_popen.return_value.communicate.return_value = ('Running', '')
    
        call_something(args)
    
        self.assertEqual(
            [binary] + args,
            mock_popen.call_args_list
        )
    

    我在这里遇到的问题是,首先调用二进制文件(我不想这样),其次, call_args_list 为空。

    1 回复  |  直到 7 年前
        1
  •  6
  •   Romain Cata    7 年前

    使用时 mock.patch 必须指向导入对象

    看到了吗 documentation this article 这很好地解释了这一点。


    例如,在您的情况下:

    密码py公司

    from subprocess import Popen
    
    def call_something(argument_list):
        binary = '/opt/mybin/'
        Popen([binary] + argument_list)
    

    测验py公司 (假设两个文件位于同一文件夹中,则需要修补 code.Popen 而不是 subprocess.Popen 试验中)

    from code import call_something
    
    @mock.patch('code.Popen')
    def test_call_something(self, mock_popen):
       binary = '/opt/mybin/'
       args = ['foo', 'bar']
       mock_popen.return_value.returncode = 0
       mock_popen.return_value.communicate.return_value = ('Running', '')
    
       call_something(args)
    
    self.assertEqual(
        [binary] + args,
        mock_popen.call_args_list
    )