2017-01-19 4 views
0

Я не слишком долго кодировал, поэтому извиняюсь, если это не очень хорошо сочленено.Как проверить функции с помощью методов File.Create() и File.Delete() в xunit?

Итак, я пытаюсь использовать конструкторы и IDisposable, чтобы написать модульные тесты в xunit, которые проверяют некоторые функции, связанные с созданием и удалением файлов. Первоначально я начал писать тесты без какого-либо эквивалента «setup»/«teardown», но я столкнулся с проблемой прохождения тестов при первом запуске, но неудача во втором раунде, поскольку файл, который я тестировал, мог быть удален, был уже удален в предыдущий пример запуска теста! Итак, теперь я пытаюсь включить в свой конструктор методы типа File.Create («путь к файлу»), «File.Delete (« путь к файлу »)», но обнаруживаю, что мои тесты все ломаются, как только Я включаю один из этих методов. Это не происходит с «Directory.CreateDirectory()» или «Directory.Delete()».

В качестве примера, вот пример рода вещи я пытался с помощью конструктора ...

public class SetUp : IDisposable 
{ 
    protected SetUp() 
    { 
     Directory.CreateDirectory(@"c:\Projects\Tests\Test"); 
     File.Create(@"c:\Projects\Tests\test.txt"); 
    } 

    public void Dispose() 
    { 
     Directory.Delete(@"c:\Projects\Tests\Test", true); 
     File.Delete(@"c:\Projects\Tests\test.txt"); 
    } 
} 

Это необходимо для следующего теста:

[Theory] 
    [InlineDataAttribute(@"c:\Projects\Tests\test3.txt")] 
    public void CanRemoveFile(string filePath) 
    { 
     //Assign 
     var myInstanceOfApphelper = new AppHelper(); 
     bool fileExists = true; 
     //Act 
     myInstanceOfApphelper.RemoveFile(filePath); 
     fileExists = myInstanceOfApphelper.CheckFileExists(filePath); 
     //Assert 
     Assert.Equal(false, fileExists); 
    } 

.. .as без этой части конструктора для создания файла перед запуском тестов, в следующий раз в этом месте не будет файлов, которые будут удалены, когда я запустил тест, и он не сработает. Однако, как только я включаю строку File.Create(@"c:\Projects\Tests\test.txt");, все мои тесты прерываются. Ошибки я возвратили все

«Процесс не может получить доступ к файлу„C: \ Projects \ Тесты \ test.txt“. , так как он используется другим процессом»

но я не могу понять это, так как большинство тестов не используют 'c: \ Projects \ Tests \ test.txt в любом случае!

Может ли кто-нибудь сказать мне, почему это не сработает? Как я могу протестировать создание и удаление файлов в инфраструктуре xunit таким образом, чтобы тесты проходили последовательно? Можете ли вы указать на очевидные ошибки в том, как я это написал?

+0

Как вы используете свой класс 'Setup'? Я не вижу, что вы на самом деле используете его в тесте. –

+0

У меня иногда возникают проблемы. Я обнаружил, что использование объекта 'System.IO.FileInfo' для создания и удаления файлов работает лучше, чем использование статических методов' File.Create' и 'File.Delete'. –

+0

Вы также можете проверить, что каталог не доступен только для чтения, как это обычно бывает, если VS помещает ваши скомпилированные исполняемые файлы. –

ответ

1

Поведение, которое вы описываете, означает, что вы храните дескриптор файла между двумя тестами. Я предлагаю вам дважды проверить, как работают ваши настройки и срывки, потому что кажется, что вы делаете это неправильно (не вызывая их до и после каждого теста).

Бонус: Я рекомендую не использовать реальную файловую систему при выполнении модульных тестов. Есть в файловых системах памяти, которые позволяют полностью очистить ваши рабочие пространства и быть уверенными, что вы не обеспокоены физической файловой системой. Например, проверьте: https://github.com/bobvanderlinden/sharpfilesystem

+0

Простите меня, если это невероятно простой вопрос, но можете ли вы указать мне в правильном направлении, как вызвать настройку и отрыв в тестах? На данный момент я реализую SetUp в своем тестовом классе, но ничего не делаю для каждого отдельного теста, который использует настройку и срыв. Я не вижу ничего очевидного в примерах, которые я смог найти, которые показывают, как это сделать! – jamessct

+0

В xunit настройка выполняется в конструкторе класса, а отключение выполняется в методе dispose (реализует IDisposable). Их документация совершенно ясна, они препятствуют установлению и разрыву принципа. Я не согласен, но это мое личное мнение. Я предпочитаю использовать Nunit, который является более мощным. –

Смежные вопросы