python - 用乏味的 __init__ 模拟一个类

标签 python django mocking pytest

我有一个实际连接到服务并执行身份验证和其他操作的类,但所有这些都在我的代码中的其他地方进行了很好的测试,我只想在以下测试中进行模拟:

带有繁琐 __init__ 的对象

class B(object):
    def __init__(self, username, password):
        con = connect_to_service() # 
        auth = con.authenticate(username, password)

    def upload(self)
        return "Uploaded"

class A(object):
    def send():
       b = B('user', 'pass')
       b.upload()

测试.py

# Now, I want here to test A, and since it uses B, I need to mock it, but I can't get it to work.
def test_A():
    # Here I need to mock B and B.upload, I tried this:
    a = A()
    b = Mock()
    b.upload.return_value='Hi'
    a.send()

但是这个测试失败了,因为它到达了 B.init 上的 auth(),我想将其作为 Mock 模型。

最佳答案

我认为这是 mock.patch 的典型用例。注意 patch 装饰器需要主模块变为 __main__

的模块的完整路径
from mock import patch, Mock
from abmodule import A,  B #Where A and B are

@patch("abmodule.B")
def test_A(bmock):
    # Set B costructor to return a Mock object
    bmock.return_value = Mock()
    bmock.upload.return_value='Hi'
    a = A()
    a.send()
    #Check if upload was called!
    bmock.return_value.upload.assert_called_with()

之后,您可以在代码的另一部分再次使用原始的 B:修补后的版本就在函数的范围内。

关于python - 用乏味的 __init__ 模拟一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26374539/

相关文章:

django - 连接路径(相对路径)位于基本路径组件(完整路径)之外

python - 如何列出 Django 中所有与表单相关的错误?

python - 仅模拟副作用 X 次

python - 使用biopython解析Fasta文件描述

python - 通过 Python 读取 Outlook 事件

python - 如何用 .sql 文件替换当前工作的 MySQL 数据库?

unit-testing - Dynamics CRM 2011 模拟

python - 图形解析错误

ajax - Django csrf_token 以一种形式工作,但不能以其他形式工作

javascript - 如何在 angularjs 测试中模拟 $location.host()?