本文介绍了使用 @mock.patch.object 模拟方法时未按预期设置返回值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的测试应该有理由成功,因为我给了一个带有 mocker.return_value 的返回值,它应该给客户一个值,以便函数调用在 else 语句客户找到"中结束.但事实并非如此,据我所知,返回值没有被正确模拟,但为什么呢?

My test should with reason succeed as I'm giving a return value with mocker.return_value,which should give customers a value so the function call ends up in the else statement "Customer found".But it does not, from what I can tell the return value is not being mocked correctly, but why?

模拟:

from datachecker import DataChecker
from unittest import mock

@mock.patch.object(DataChecker, "execute_db")
def test_find_customer_true(mocker):
    mocker.return_value = 1
    assert DataChecker.find_customer(mocker, 1) == True

类:

import sqlite3
from customer import Customer

class DataChecker:
   def __init__(self):
        self.conn = sqlite3.connect('pos.db')
        self.cursor = self.conn.cursor()

    def find_customer(self, customerID):
        query = "SELECT * FROM Customers WHERE ID == ?;"
        customers = self.execute_db(query, customerID, True)
        print(customers)
        
        if len(customers) == 0:
            print("Customer with given ID not found in DB")
            return False
        else:
            print("Customer found")
            return True

    def execute_db(self, query, params=None, fetch_one=False):
        if params:
            self.cursor.execute(query, [params])
            self.conn.commit()
        else:
            self.cursor.execute(query)
            self.conn.commit()
        if fetch_one:
            return self.cursor.fetchone()
        else:
            return self.cursor.fetchall()

错误:

=============================================================================================== FAILURES ================================================================================================
________________________________________________________________________________________ test_find_customer_true ________________________________________________________________________________________

mocker = <MagicMock name='execute_db' id='139976570824072'>

    @mock.patch.object(DataChecker, "execute_db")
    def test_find_customer_true(mocker):
        mocker.return_value = "hej"
>       assert DataChecker.find_customer(mocker, 1) == True
E    AssertionError: assert False == True
E     +  where False = <function DataChecker.find_customer at 0x7f4ed5e26598>(<MagicMock name='execute_db' id='139976570824072'>, 1)
E     +    where <function DataChecker.find_customer at 0x7f4ed5e26598> = DataChecker.find_customer

../lab2/tests/test_datachecker.py:45: AssertionError
----------------------------------------------------------------------------------------- Captured stdout call ------------------------------------------------------------------------------------------
<MagicMock name='execute_db.execute_db()' id='139976570473832'>
Customer with given ID not found in DB
======================================================================================== short test summary info ========================================================================================
FAILED tests/test_datachecker.py::test_find_customer_true - AssertionError: assert False == True

print(customers) 给出:<MagicMock name='execute_db.execute_db()' id='139976570473832'>

print(customers) gives:<MagicMock name='execute_db.execute_db()' id='139976570473832'>

在我看来,这里似乎有问题..execute.db.execute_db().根据我的逻辑,这个打印应该给出:1?

To me it looks like there's something wrong here.. execute.db.execute_db().According to my logic this print should give: 1?

推荐答案

不需要为此测试打任何补丁.由于您直接调用实例方法,因此您可以简单地将模拟作为 self 参数传入.

It is not necessary to patch anything for this test. Since you're calling instance methods directly, you can simply pass a mock in as the self parameter.

from datachecker import DataChecker
from unittest.mock import Mock

def test_find_customer_true(mocker):
    mock_datachecker = Mock()
    mock_datachecker.execute_db.return_value = [1]
    assert DataChecker.find_customer(mock_datachecker, 1) == True

这篇关于使用 @mock.patch.object 模拟方法时未按预期设置返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-28 04:41