我有以下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。
答案 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。我认为您面临的问题可能与您想要模拟的类的正确路径有关。