模拟对象不可迭代

L T*_*son 5 python unit-testing

我目前正在尝试(但失败了)在我的简单应用程序上执行单元测试,该应用程序将数据发布到 MySQL 数据库。下面是我尝试运行的单元测试,不确定这是否能成功测试我的代码,但会出现 TypeError: 'Mock' object is not iterable

单元测试.py

from unittest import mock
from unittest.mock import patch, MagicMock
from unittest.mock import Mock


from source.src.scores import *


@mock.patch('source.src.scores.request')
def test_add_scores(self):
    columns = ["Match_ID", "Home_Score", "Away_Score"]
    values = [1, 1, 1]

    expected_score = {columns[i]: values[i] for i in range(len(columns))}

    with patch('source.src.scores.mysql.connector') as patch_connector:

        cursor = Mock()
        cursor.fetchone.return_value = values
        cursor.column_names = columns
        connect = Mock()
        connect.cursor.return_value = cursor

        patch_connector.connect.return_value = connect

        with patch('source.src.scores.jsonify') as json:
            json.return_value = expected_score

            json_return, http_code = add_score()

        assert patch_connector.connect.called
        assert connect.cursor.called
        assert connect.commit.called
        assert cursor.fetchone.called
        self.assertEqual(cursor.execute.call_count, 2)
        self.assertDictEqual(expected_score, json_return)


if __name__ == '__main__':
test_add_scores()
Run Code Online (Sandbox Code Playgroud)

分数.py

 def execute_query(cursor, qry):
print("Executing query...")
cursor.execute(qry)


def execute_query_json(cursor, qry, cnx):
print("Executing JSON query...")
cursor.execute(qry, (request.json['Match_ID'],
                     request.json['Home_Score'],
                     request.json['Away_Score'],
                     )
               )
cnx.commit()


def add_score():
cnx = conn_db()
cursor = cnx.cursor()
print("Updating score")

execute_query_json(cursor, "INSERT INTO scores (Match_ID, Home_Score, Away_Score) VALUES (%s,%s,%s)", cnx)
execute_query(cursor, "SELECT * FROM scores WHERE Score_ID=" + str(cursor.lastrowid))
recs = extract_records(cursor)

return jsonify({'discipline':recs}), 201
Run Code Online (Sandbox Code Playgroud)

非常感谢任何帮助

g.d*_*d.c 10

当您创建模拟时,有时必须让它知道如何响应一些预期的调用。举个例子:

class A(object):
  def __init__(self):
    self.items = []
Run Code Online (Sandbox Code Playgroud)

如果您要创建一个 Mock 来代替 的实例A,则当您尝试请求时,该模拟将不会自动知道如何响应.items。您可以通过将特定属性作为关键字传递给构造函数来告诉 Mock 返回什么来克服这个问题,如下所示:

mocked_a = Mock(items = [])
Run Code Online (Sandbox Code Playgroud)

现在,当您调用时,mock_a.items您将得到一个空列表,因此迭代不会出错。