Проверить, если метод класса был вызван из другого метода класса



Можно проверить, был ли вызван метод с использованием Moq и инъекции зависимостей. Однако можно ли проверить, вызывает ли один метод в классе другой в том же классе?



Например, я хочу проверить, что если я регистрирую определенное исключение, то также регистрируется и информационное сообщение.



Метод таков:



public void Error(string message, Exception exception, long logId = 0)
{
var int32 = (int)logId;
Info("Id was converted to an int so that it would fit in the log: " + logId, int32);
Error(message, exception, int32);
}


Это была моя попытка модульного тестирования. Тест провалился, есть ли какой-то способ, которым это можно сделать?

void logging_an_error_with_a_long_id_also_logs_info()
{
var mock = new Mock<ILogger>();
var testedClass = new Logger();
var counter = 0;

testedClass.Error("test" + counter++, new Exception("test" + counter), Int64.MaxValue);

mock.Verify(m => m.Info(It.IsAny<string>(), It.IsAny<int>()));
}


Так как Info и Error методы находятся в том же классе (ClassA), я не верю, что могу передать ClassA как зависимость в ClassA. Так не нужно ли его проверить?

588   2  

2 ответов:

Лучшее, что вы можете сделать, - это сделать Info virtual. Это позволит вам создать Mock<Logger>, установить CallBase = true и проверить, что Info был вызван.

var mock = new Mock<Logger> 
{
    CallBase = true
};

mock.Object.Error("test" + counter++, new Exception("test" + counter), Int64.MaxValue);

mock.Verify(m => m.Info(It.IsAny<string>(), It.IsAny<int>()));

Таким образом, вы все еще вызываете фактическую реализацию Error, но вы использовали Moq для проверки того, что метод Info был вызван.

Такое чувство, что вы пытаетесь проверить не ту вещь. На самом деле не важно, что метод Info в вашем классе вызывается из Метода Error, Важно то, что происходит поведение метода Info. То, как это происходит, является деталью реализации класса.

Если бы у меня был класс математики с двумя функциями:

public int Mult(int x, int y) {
    return x*y;
}

public int Sqr(int x) {
    return Mult(x,y);
}

Я бы не стал проверять, что вызов Sqr вызван к функции Mult, я бы проверил Sqr(4)==16. Не имеет значения, если это вычисление происходит в Метод Sqr, или в другом методе класса.

В то время как решение @Andrew , вероятно, то, что вы ищете, издеваясь над классом, который вы тестируете, как правило, приводит к плотно связанным, хрупким тестам.

Если непрактично тестировать вызов, наблюдая его побочные эффекты, то это может быть признаком того, что реализация может использовать немного рефакторинга.

Comments

    Ничего не найдено.