Этот вопрос содержит ответы, показывающие, как можно проверить Environment.Exit()
. Внедрение зависимостей в конструктор
Один из вариантов - преобразовать его в зависимость, внедрив его через интерфейс:
interface ITerminator
{
void Exit();
}
class RealTerminator
{
void Exit()=>Environment.Exit();
}
public class MyErrorChecker
{
ITerminator _terminator;
public class MyErrorChecker(ITerminator terminator)
{
_terminator=terminator;
}
public void ErrorEncounter()
{
//Global Error Counter
gblErrorCount++;
//Process tremination
_terminator.Exit();
}
}
В тестовом проекте будет реализован поддельный класс терминатора, которыйустанавливает флаг, если вызывается Exit
:
class FakeTerminator:ITerminator
{
public bool Called{get;private set;}
public void Exit()
{
Called=true;
}
}
Пересмешка
Другой вариант - смоделировать его путем извлечения вызова виртуального метода, который можно заменитьв фиктивном классе:
public void ErrorEncounter()
{
//Global Error Counter
gblErrorCount++;
//Process tremination
ForceExit();
}
internal virtual void ForceExit()
{
Environment.Exit();
}
В тестовом проекте может быть создан фиктивный класс проверки ошибок:
class MockErrorChecker:MyErrorChecker
{
public bool Called{get;private set;}
public override void ForceExit()
{
Called=true;
}
}
Внедрение функции
Эта опцияне включен в связанный вопросПередайте exit
Action
в качестве параметра ErrorEncounter
, по умолчанию который будет вызывать Environment.Exit()
:
public void ErrorEncounter(Action exitFn=null)
{
var doExit=exitFn ?? (()=>Environment.Exit());
//Global Error Counter
gblErrorCount++;
//Process tremination
doExit();
}
. Тест может передать свою собственную функцию, которая устанавливает флаг:
[Test]
public void Test_Exit_Is_Called
{
bool called;
void fakeExit() { called=true; }
thatClass.ErrorEncounter(fakeExit);
Assert.True(called);
}