如何模拟对相关模型方法的调用?

时间:2015-10-26 08:53:04

标签: django unit-testing mocking

我有以下django模型

class Charge(models.Model):
    total = models.PositiveIntegerField()

    def execute():
        # make some external calls
        return invoice_url

class Transaction(models.Model):
    product = models.ForeignKey(Product)
    charge = models.ForeignKey(Charge)

    def do_charge():
        self.charge = Charge.objects.create(total=self.product.price)
        url = self.charge.execute()
        return url

我试图通过模拟对do_charge的调用来测试execute。 问题是该对象是在do_charge内创建的。

类似的东西(这显然不适用于说明)

@mock.patch('Charge.execute')
def test_should_return_url(self, mock):
    mock.side_effect = 'www.foo.testing/invoice' 
    t = Transaction.objects.create(product=p1)
    invoice_url = t.do_charge()
    self.assertIsEqual(invoice_url, 'www.foo.testing/invoice')

是否可以模拟Charge.execute

python 3.4,django 1.8。

1 个答案:

答案 0 :(得分:0)

我已经尝试了下一个代码来测试模拟行为,似乎模拟Charge.execute应该可以工作。

>>> class A(object):
...     def foo(self):
...         return 'a'

>>> @mock.patch('__main__.A.foo', return_value='12')
... def bar(mockfoo):
...     a = A()
...     return a.foo()
... 
>>> bar()
'12'

这里我模拟了一个类的方法,创建一个类实例并调用了对象的方法,并使用了模拟版本。所以我认为在你的测试模拟中将使用Charge.execute。我认为您面临的问题可能与您想要模拟的类的正确路径有关。