Python: не может перебрать значения макета базы данных в макете объектов - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь написать модульный тест для 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

1 Ответ

0 голосов
/ 21 ноября 2018

Хорошо, поэтому я разобрался с проблемой.Я просто немного перепутал с издевательством над моими объектами

Вот обновленный тестовый код, который теперь работает:

@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 = ["player_id", "first_name", "surname", "position", "player_number",
               "team_id", "current_yellow_cards", "match_ban"]
    values_1 = (1, "Porko", "Molo", "striker", 12, None, 0, 0)
    values_2 = (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 = MagicMock()
    cursor.fetchall.return_value = [values_1, values_2]
    cursor.column_names = columns
    connect = MagicMock()
    connect.cursor.return_value = cursor
    patch_connector.connect.return_value = connect

    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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...