【问题标题】:Python mocking a function globally works but local mock failsPython 在全局范围内模拟函数有效,但本地模拟失败
【发布时间】:2019-09-16 09:25:21
【问题描述】:

我在“testing_print”目录下有一个简单的源文件“hello.py”,在“Tests”目录下有一个单元测试用例“test_hello.py”。这两个目录都在“test_hello_files”目录下。

我正在尝试为“hello.py”文件编写一个单元测试用例“test_hello.py”,并为其添加一个模拟来伪造“sample_greet1”函数。

如果我在全局范围内添加模拟,则测试用例通过,但如果模拟在本地定义,则测试用例失败。

hello.py

from import_file import sample_greet1

def greet1():
    s = 'hi'
    greet=sample_greet1(s)
    return greet

test_hello.py

import sys
import pytest
from mock import Mock

impo_class=sys.modules['import_file'] = Mock()
impo_class.sample_greet1 = Mock(return_value = "Prasad")  #Test case passes if the mock is here

from testing_print import hello

def test_greet1():
    print('impo_class.sample_greet1 ----', impo_class.sample_greet1())
    impo_class.sample_greet1 = Mock(return_value = "Prasad")  #Test case fails if the mock is here

    s = hello.greet1()
    assert s == 'Prasad'

我想在函数中本地使用模拟。请让我知道我做错了什么。

【问题讨论】:

    标签: python mocking code-coverage pytest


    【解决方案1】:

    我建议使用补丁装饰器。它会自动将函数替换为 Mock 对象,因此您不必手动导入和更改它。

    mock 将作为参数传递给修饰的测试 abd 它将是本地的。一旦函数结束,Mock 就会被移除并恢复原来的函数。

    from unittest.mock import patch
    from testing_print import hello
    
    @patch('testing_print.hello.sample_greet1', return_value='Prasad')
    def test_greet1(mock):
        s = hello.greet1()
        assert s == 'Prasad'
    

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多