问题描述
我的测试应该有理由成功,因为我给了一个带有 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 模拟方法时未按预期设置返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!