Почему SonarQube утверждает, что строка `return` не покрыта модульным тестом? - PullRequest
3 голосов
/ 24 января 2020

Вот моя конечная точка API:

[HttpPost]
public int Post(SearchHistory searchHistory)
{
    IDashboardRepository dashboardrepos = new DashboardRepository();
    int historyId = dashboardrepos.SaveSearchHistoryByUser(searchHistory);
    return historyId;
}

А вот отчет SonarQube:

enter image description here

Две зеленые полосы на строки 37 и 38 указывают, что они охвачены модульным тестом. Но по какой-то причине вроде 39 нет?

Вот тест:

[TestMethod()]
public void GlobalSeach_PutTest()
{
    SearchHistory history = new SearchHistory {
        // redacted for ease of reading on SO
    }
    var controller = new GlobalSearchController(_config);
    int? response = controller.Post(history);
    Assert.IsTrue(response != null);
}

1 Ответ

2 голосов
/ 24 января 2020

Ваш метод Post возвращает int. В вашем тесте вы ожидаете получить обнуляемое значение int (int?).

Моя проблема в том, что вы на самом деле не проверяете результат вашего метода при использовании этого утверждения: Assert.IsTrue(response != null);. Первая проблема заключается в том, что такого рода тесты никогда не пройдут.

Я полагаю, что ваш метод dashboardrepos.SaveSearchHistoryByUser должен возвращать первичный ключ сущности, которую вы только что сохранили в своей БД. Исходя из этого предположения, я предлагаю вам провести рефакторинг теста, как я опишу ниже, чтобы улучшить и решить проблему с покрытием.

[TestMethod()]
public void GlobalSeach_PutTest()
{
    SearchHistory history = new SearchHistory {
        // redacted for ease of reading on SO
    }

    // _dashboardreposMock is an example of Mock<IDashboardRepository>
    _dashboardreposMock.Setup(_ => _.SaveSearchHistoryByUser(It.IsAny<SearchHistory>)).Returns(1);

    var controller = new GlobalSearchController(_config);
    int response = controller.Post(history);
    Assert.IsTrue(response == 1);
}
...