2015-10-26 47 views
0

我有以下的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 

我试图嘲弄调用execute测试do_charge。 问题是该对象是在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

执行不是一个静态方法,是吗? – Nick

+0

不,这是一种实例方法。 – haki

回答

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。我认为你面临的问题可能与你想嘲笑的课程的正确路径有关。

+0

是的,问题是,当将模拟的'charge'分配给'transaction.charge'时,它会抛出无效类型(这是有道理的)。尽管可能只模拟模型实例方法。 – haki

相关问题