我很难让考试按预期进行。我试图模拟两个属性的返回值和一个测试的方法,但是我得到的不是期望的返回值,而是MagicMock对象。
我不知道怎么做。最让我恼火的是,模拟方法的工作与预期的一样,但对于这两个属性却不是。
这是因为我在使用属性,还是因为外键关系,还是我做了一些基本的错误?
我用的是Django 1.8,Python2.7,model mommy,unittests,mock
下面是我的一些代码片段,我希望它们足以理解这种情况:
App1调用生产者

# In producers.models.Producer:

    @property
    def is_valid(self):
        # do stuff
        return True

App2呼叫客户
# In customers.models.Customer:

    @property
    def is_valid(self):
        # do stuff
        return True

    def is_allowed_to_purchase_from_producer(producer):
        # do stuff
        return True

App3调用采购
# In purchases.models

class Purchase(BaseModel):

    producer = ForeignKey('Producers.Producer', related_name="purchase")
    customer = ForeignKey('Customers.Customer', related_name="purchase")


    def clean(self):
        if not self.producer.is_valid:
            rasie ValidationError
        if not self.customer.is_valid:
            raise ValidationError
        if not self.customer.is_allowed_to_purchase_from_producer(self.producer):
            raise ValidationError

采购模型清洁方法的检验
# test_models.py, in PurchaseTestSuite

    @mock.patch('producers.models.Producer.is_valid')
    @mock.patch('customers.models.Customer.is_valid')
    @mock.patch('customers.models.Customer.is_allowed_to_purchase_from_producer')
    def test__clean(self, mock__customer_is_allowed_to_purchase, mock__customer_is_valid, mock__producer_is_valid):

        mock__producer_is_valid.return_value = True
        mock__customer_is_valid.return_value = False
        mock__customer_is_allowed_to_purchase.return_value = False

        valid_purchase.clean()

producer.的实际返回值是否有效:<MagicMockname='is_valid' id='4465040784'>
实际返回的值
客户是否有效:<MagicMock name='is_valid' id='4465109520'>
对于客户。是否允许从生产商(生产商)购买:错误
当断言属性是否已被调用时,我得到False,但对于方法,我得到True。区别在哪里?我看不到什么?

最佳答案

感谢Daniel Roseman的评论和PropertyMock的链接,我设法找到了运行测试的方法。
作为属性或其他描述符使用的模拟
上课。PropertyMock提供get()和set()方法,因此
可以在获取返回值时指定该值。
因此,对于上面的示例,简单的解决方案是对所有属性使用PropertyMock,如下所示:

@mock.patch('producers.models.Producer.is_valid', new_callable=mock.PropertyMock)

其余的和上面的例子一样。
如果有人有类似的问题,我希望这能有所帮助。

10-04 22:54
查看更多