Как выполнить модульное тестирование метода записи файлов с помощью встроенных автоматических тестов Visual Studio? - PullRequest
5 голосов
/ 16 января 2009
  1. Я использую автоматизированные тесты Visual Studio 2008 Professional. У меня есть функция, которая пишет в файл. Я хочу провести модульное тестирование функции записи файла. Я где-то читал, что мне придется каким-то образом издеваться над файлом. Я не знаю, как это сделать. Вы можете помочь?

  2. Как выполнить юнит-тестирование метода загрузки страницы из Интернета?

Ответы [ 4 ]

7 голосов
/ 16 января 2009

Если метод должен открыть сам поток файлов, то это трудно для насмешки. Однако, если вы можете передать поток в метод и заставить его записать в него, вы можете вместо этого передать MemoryStream. Альтернативная перегрузка может принимать меньше параметров, открывать файл и передавать FileStream другому методу.

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

6 голосов
/ 16 января 2009

Зависит от того, насколько близок ваш код к гайкам и болтам; например, вы можете вместо этого работать в Stream s и передавать код MemoryStream (и проверять содержимое). Вы можете просто записать в файловую систему (во временной области), проверить содержимое и отказаться от него впоследствии. Если ваш код немного выше файловой системы, вы можете написать фиктивный IFileSystem интерфейс с необходимыми вам высокоуровневыми методами (такими как WriteAllBytes / WriteAllText). Хотя было бы больно издеваться над потоковыми API.

Для загрузки из Интернета (или претендуя на) ... вы могли бы (например) написать IWebClient интерфейс с нужными вам функциями (например, DownloadString и т. Д.); макет, чтобы вернуть фиксированный контент, и использовать что-то вроде WebClient в качестве основы для фактической реализации. Конечно, вам нужно будет проверить фактическую реализацию на реальных сайтах.

4 голосов
/ 16 января 2009

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

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

То же самое верно для доступа к веб-странице.

interface IFileService
{
     Stream CreateFile(string filename); 
}

class InMemoryFileService : IFileService
{
    private Dictionary<string, MemoryStream> files = new Dictionary<string, MemoryStream>();

    public Stream CreateFile(string filename)
    {
       MemoryStream stream = new MemoryStream();
       files.Add(filename, stream);
       return stream;
    }

    public MemoryStream GetFile(string filename)
    {
         return files[filename];
    }
} 

Используя GetFile, вы можете найти то, что должно быть записано на диск.

1 голос
/ 16 января 2009

На самом деле вы не хотите делать вызов, чтобы записать файл непосредственно в вашу функцию, но вместо этого оберните файловый ввод-вывод внутри класса с интерфейсом.

Затем вы можете использовать что-то вроде Rhino Mocks для создания ложного класса, реализующего интерфейс.

...