Подтвердить что ты не робот

Разделить на ноль и нет ошибки?

Просто скомпилировал простой тест, а не по какой-либо конкретной причине, кроме как мне хотелось попробовать тесты для всех моих методов, хотя это довольно просто, или так я думал.

    [TestMethod]
    public void Test_GetToolRating()
    {
        var rating = GetToolRating(45.5, 0);
        Assert.IsNotNull(rating);
    }


    private static ToolRating GetToolRating(double total, int numberOf)
    {
        var ratingNumber = 0.0;

        try
        {
            var tot = total / numberOf;
            ratingNumber = Math.Round(tot, 2);
        }
        catch (Exception ex)
        {
            var errorMessage = ex.Message;
            //log error here
            //var logger = new Logger();
            //logger.Log(errorMessage);
        }


        return GetToolRatingLevel(ratingNumber);
    }

Как вы можете видеть в методе тестирования, я разделяю на ноль. Проблема в том, что она не генерирует ошибку. См. Экран окна ошибок ниже.

Просмотр списка ошибок из VS2017

Вместо ошибки он дает значение бесконечности? Что я пропущу? Поэтому я искал googled и обнаружил, что удвоения, деленные на ноль, НЕ генерируют ошибку, они либо дают нуль, либо бесконечность. Тогда возникает вопрос, как один тест для возвращаемого значения Infinity?

4b9b3361

Ответ 1

У вас будет DivideByZeroException только в случае целых значений:

int total = 3;
int numberOf = 0;

var tot = total / numberOf; // DivideByZeroException thrown 

Если хотя бы один аргумент представляет собой значение с плавающей запятой (double в вопросе), в результате вы получите FloatingPointType.PositiveInfinity(double.PositiveInfinity в контексте) и исключение

double total = 3.0;
int numberOf = 0;

var tot = total / numberOf; // tot is double, tot == double.PositiveInfinity

Ответ 2

Вы можете проверить, как ниже

double total = 10.0;
double numberOf = 0.0;
var tot = total / numberOf;

// check for IsInfinity, IsPositiveInfinity,
// IsNegativeInfinity separately and take action appropriately if need be
if (double.IsInfinity(tot) || 
    double.IsPositiveInfinity(tot) || 
    double.IsNegativeInfinity(tot))
{
    ...
}