Я пытаюсь написать модульный тест для GET API, который извлекает все записи из базы данных MySQL.Я хочу смоделировать все возвращенные записи, так как я не хочу выполнять какие-либо реальные взаимодействия с базой данных для этого теста и иметь полный контроль над тем, что было возвращено.
Когда дело доходит до утверждения, проверяемоеjson_return
пусто, так как при его создании цикл for
не собирает никаких строк из смоделированного метода fetchall
.Я попытался отключить атрибут return_value
для side_effect
, так как я читал, что он используется, когда вы хотите перебрать свой смоделированный объект, но мне все еще не повезло.
Где я?Я ошибаюсь?
Вот мой код для теста:
@patch('database.mysql_utilities.mysql.connector')
def test_get_all_players_api(self, patch_connector):
self.assertIs(database.mysql_utilities.mysql.connector, patch_connector)
columns = ["first_name", "surname", "position", "player_number",
"team_id", "current_yellow_cards", "match_ban"]
values_1 = ("Porko", "Molo", "striker", 12, None, 0, 0)
values_2 = ("Dan", "Welbeck", "defender", 4, None, 0, 0)
player_1 = {columns[i]: values_1[i] for i in range(len(columns))}
player_2 = {columns[i]: values_2[i] for i in range(len(columns))}
players = [player_1, player_2]
cursor = patch_connector.cursor.return_value
cursor.fetchall.return_value = [values_1, values_2]
cursor.column_names.return_value = columns
expected_json = {'players': players}
response = self.app.get('/api/v1/players')
json_return = json.loads(response.get_data(as_text=True))
self.assertDictEqual(json_return, expected_json)
А вот где используются макеты:
def get_all_player_from_db():
cnx = get_connection()
cursor = cnx.cursor()
query = "SELECT * FROM player"
cursor.execute(query)
rows = cursor.fetchall()
columns = cursor.column_names
players = []
for row in rows:
print("in loop")
player = {}
for (key, value) in zip(columns, row):
print(value)
player[key] = value
players.append(player)
cnx.close()
return players