Как сказано прежде, необходимо использовать класс, реализовывая интерфейс Set вместо Списка, чтобы быть уверенными в уникальности элементов. Если необходимо сохранить порядок элементов, интерфейс SortedSet может тогда использоваться; реализации класса TreeSet тот интерфейс.
Звучит как невероятно плохая идея. Environment.Exit (0), очевидно, будет работать в соответствии с предписаниями, поэтому ваши модульные тесты не работают.
Если вы действительно хотите проверить это, вы можете запустить отдельный процесс и проверить код возврата - взгляните на упаковку его можно найти в Process.Start .
Думаю, еще одним вариантом является выделение этого кода и внедрение тестового шпиона или использование фиктивного объекта для проверки правильного поведения.
Возможно, вы сможете что-то сделать с Typemock Isolator - я считаю, что это позволяет вам имитировать статические методы .
Единственный вариант здесь - имитировать класс Environment с помощью фейкового метода Exit.
Единственное, что мне приходит в голову, это что-то вроде:
static void myMethod()
{
DoEnvironmentExit(0);
}
static void DoEnvironentExit(int code)
{
#if defined TEST_SOLUTION
SomeMockingFunction(code);
#else
Environment.Exit(code);
#endif
}
Вы можете добавить аргумент в свой метод, чтобы передать ему поддельное окружение, в котором функция exit () метод не выйдет.
Вы можете извлечь этот параметризованный метод из метода, вызываемого из вашего приложения, и выполнить модульное тестирование извлеченной функции. Таким образом, вам не придется изменять приложение.
Вам нужно будет создать оболочку для класса Environment, а затем использовать оболочку в своем коде. Для своих модульных тестов внедрите фиктивную версию оболочки. В следующем примере используется RhinoMocks для проверки того, что метод вызывает оболочку с ожидаемым аргументом.
public class EnvironmentWrapper
{
public virtual void Exit( int code )
{
Environment.Exit( code );
}
}
public class MyClass
{
private EnvironmentWrapper Environment { get; set; }
public MyClass() : this( null ) { }
public MyClass( EnvironmentWrapper wrapper )
{
this.Environment = wrapper ?? new EnvironmentWrapper();
}
public void MyMethod( int code )
{
this.Environment.Exit( code )
}
}
[TestMethod]
public void MyMethodTest()
{
var mockWrapper = MockRepository.GenerateMock<EnvironmentWrapper>();
int expectedCode = 5;
mockWrapper.Expect( m => m.Exit( expectedCode ) );
var myClass = new MyClass( mockWrapper );
myclass.MyMethod( expectedCode );
mockWrapper.VerifyAllExpectations()
}
Вы не сможете это проверить - Environment.Exit
полностью закрывает приложение. Это означает, что любой домен приложений, использующий этот код, будет полностью выгружен, будь то ваше производственное приложение или среда модульного тестирования.