Q1:
У вас есть три варианта здесь.
Вариант 1: жить с ним.
(без примера: P)
Вариант 2: при необходимости создайте небольшую абстракцию.
Вместо того, чтобы выполнять файловый ввод-вывод (File.ReadAllBytes или любой другой) в тестируемом методе, вы можете изменить его так, чтобы ввод-вывод выполнялся снаружи и вместо этого передавался поток.
public class MyClassThatOpensFiles
{
public bool IsDataValid(string filename)
{
var filebytes = File.ReadAllBytes(filename);
DoSomethingWithFile(fileBytes);
}
}
станет
// File IO is done outside prior to this call, so in the level
// above the caller would open a file and pass in the stream
public class MyClassThatNoLongerOpensFiles
{
public bool IsDataValid(Stream stream) // or byte[]
{
DoSomethingWithStreamInstead(stream); // can be a memorystream in tests
}
}
Этот подход является компромиссом. Во-первых, да, это более проверяемое. Тем не менее, он обменивает тестируемость на небольшое дополнение к сложности. Это может повлиять на удобство обслуживания и объем кода, который вам нужно написать, плюс вы можете просто переместить проблему тестирования на один уровень выше.
Однако, по моему опыту, это хороший, сбалансированный подход, так как вы можете обобщить и сделать тестируемую важную логику без привязки к полностью упакованной файловой системе. То есть Вы можете обобщить интересующие вас фрагменты, оставив все остальное как есть.
Вариант 3. Обертывание всей файловой системы
Если сделать еще один шаг вперед, то насмешка над файловой системой может быть верным подходом; это зависит от того, сколько раздуваешь, ты готов жить.
Я прошел этот путь раньше; У меня была реализация обернутой файловой системы, но в итоге я просто удалил ее. В API были тонкие различия, мне приходилось внедрять его повсюду, и, в конечном счете, это было дополнительной болью за небольшую выгоду, так как многие классы, использующие его, не были для меня чрезвычайно важны. Если бы я использовал контейнер IoC или написал что-то критическое, и тесты должны были быть быстрыми, я бы все-таки застрял с ним. Как и во всех этих вариантах, ваш пробег может отличаться.
Что касается вашего вопроса контейнера IoC:
Введите ваш тест удваивается вручную. Если вам приходится выполнять много повторяющихся работ, просто используйте методы настройки / фабрики в своих тестах. Использование контейнера IoC для тестирования было бы чрезмерным! Может быть, я не понимаю ваш второй вопрос.