Как проверить, называется ли defer - PullRequest
0 голосов
/ 14 июня 2019

У меня следующий код

func (s *MyRepo) InsertOrder(ctx context.Context, orderID string) error {
    query := `INSERT INTO orders (orderID) VALUES (?)`

    stmt, err := s.db.RawDatabase().PrepareContext(ctx, query)
    if err != nil {
        return err
    }
    defer stmt.Close()

    _, err = stmt.ExecContext(ctx, orderID)
    if err != nil {
        //log err
    }
    return err
}

И соответствующий контрольный пример:

func TestMyRepo_InsertOrder_Success(t *testing.T) {
    orderID := "orderID"
    mockDB, repo := getDBStore()
    query := `[INSERT INTO orders (orderID) VALUES (?)]`
    mockDB.ExpectPrepare(query).
        ExpectExec().
        WithArgs(orderID).
        WillReturnResult(sqlmock.NewResult(1, 1)).
        WillReturnError(nil)

    err := repo.InsertOrder(context.Background(), orderID)
    assert.Nil(t, err)
}

Но это не проверяет, был ли вызван defer stmt.Close() или нет (который вызываетсякак только функция заканчивается).Как я могу проверить это?

1 Ответ

1 голос
/ 15 июня 2019

Похоже, вы используете пакет data-dog sqlmock , поэтому вы должны иметь возможность использовать ExpectClose(), чтобы зарегистрировать ожидание закрытия базы данных.и ExpectationsWereMet() для сбора этой информации.

Если вы используете какой-либо другой пакет, не стесняйтесь связывать его;вероятно, есть что-то подобное, и в худшем случае вы можете написать свою собственную оболочку вокруг их оболочки.Убедиться в том, что конкретный метод определенной зависимости вызывается, является довольно распространенным желанием, когда разработчики пишут тесты, используя макеты, поэтому большинство лучших пакетов макетов будут изо всех сил предоставлять какой-то API для проверки этого.

Как отмечалось в комментариях к этому вопросу, тесты такого рода часто имеют несколько сомнительную ценность и могут показаться, что они существуют в большей степени для увеличения сомнительной метрики, такой как% покрытия кода, чем для повышения надежности или удобства сопровождения кода.

...