我如何模拟和单元测试以下代码?

时间:2015-04-12 00:30:39

标签: python unit-testing mocking

import module
from x import X

class A:
   def method(): 
       return module.something(arg=X())

我创建了以下单元测试:

with patch('filename.module.something') as something_mock:
   with patch('filename.X'): as x_mock:
       a.method()
something_mock.assert_called_once_with(arg=x_mock.return_value)
x_mock.assert_called_once_with()

有人提到没有解释就没有必要模仿filenme.X。还有其他方法可以验证对something的调用而不会模仿filename.X吗?如何更改以下断言以验证通话?

something_mock.assert_called_once_with(arg=_____) 

1 个答案:

答案 0 :(得分:-1)

如果创建X不是问题(即数据库连接或网络访问),您可以在不模拟的情况下进行测试。

您有以下选择:

  1. 如果您不想检查方法调用的方式mock
  2. ,请使用called的{​​{1}}属性
  3. 如果您想检查something_mock已通过something_mock关键字arg调用,但您对价值是什么感兴趣,请使用mock.ANY
  4. 使用call_args提取arg个调用参数,并calls as tuple提取something_mock
  5. 第一个是

    arg

    第二个是

    assert something_mock.called
    

    最后第三个是

    something_mock.assert_called_once_with(arg=mock.ANY)
    

    最后一个选项与模拟args, kwargs = something_mock.call_args assert isinstance(kwarg['arg'], x.X) 完全相同,但我写的只是为了展示所有可能性。