【问题标题】:Test if python's builtin __mul__ was called using mock测试是否使用 mock 调用了 python 的内置 __mul__
【发布时间】:2018-01-10 02:26:00
【问题描述】:

我有一种方法可以在调用 api 之前将美元转换为美分。

# money.py
def send_money(dollars):
    cents = dollars * 100
    return send_money_to_api(cents)

* 这不完全是我的代码。但这对于演示来说已经足够了。

dollars 的类型是 decimal.Decimal,因为它实际上来自 djangoDecimalField

我想确保将金额乘以 100。我尝试使用模拟进行测试

import mock

from money import send_money

@mock.patch('money.operator.__mul__')
@mock.patch('money.send_money_to_api')
def test_money(self, api_mock, mul_mock):
    send_money(20)

    assert api_mock.called
    mul_mock.assert_any_call(20, 100)

它没有说,

E   ImportError: No module named operator

我该如何测试?

【问题讨论】:

  • 它还能叫什么?您是否担心有人将dollars 作为具有自己的__mul__ 的类的实例传递?你担心什么?
  • 我担心某些开发人员/我会忘记进行转换。
  • dollars 的类型是什么?没有内置的__mul__,但每个对象都有自己的__mul__ 函数。所以如果要mock这个函数,就需要mockdollars的类。
  • dollars的类型是int
  • 等等。实际上是decimal.Decimal,因为它来自djangoDecimalField

标签: python unit-testing python-mock


【解决方案1】:

在 cmets 的大力帮助下,我得以解决此问题。特别感谢@Sraw

@mock.patch.object(decimal.Decimal, '__mul__')
@mock.patch('money.send_money_to_api')
def test_money(self, api_mock, mul_mock):
    send_money(20)

    assert api_mock.called
    mul_mock.assert_any_call(100)

模拟decimal.Decimal 实例方法__mul__ 的一个优点是我可以真正确保数据库中的所有DecimalField 值(主要是数量)都被转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 2018-03-25
    • 1970-01-01
    相关资源
    最近更新 更多