Directory.CreateDirectory () возвращает «Отказ в доступе к пути '.. \\ [папка] \\'».исключение при использовании с тестом SpecFlow - PullRequest
0 голосов
/ 05 июня 2018

Я работаю над созданием некоторых модульных тестов с использованием SpecFlow & NUnit.

Требование для одного из моих тестов - создать несколько папок с тестами.Тем не менее, тестовый прогон возвращает "Доступ к пути" .. \ TestFolder1 \ 'запрещен ".исключение.Я проверил и дважды проверил наличие разрешений на запись в родительской папке, попытался открыть общий доступ к родительской папке и убедился, что родительская папка или любое ее содержимое не помечены только для чтения, но ошибка сохраняется.

public static string[] CreateTestFolders()
    {
        _testFolders = new string[] { @"..\TestFolder1\", @"..\TestFolder2\", @"..\TestFolder3\", @"..\TestFolder4\", @"..\TestFolder5\" };

        for (int i = 0; i < _testFolders.Length - 1; i++)
        {
            try
            {
                Directory.CreateDirectory(_testFolders[i]);
            }
            catch(Exception ex)
            {
                string exm = Environment.UserName + " " + ex.Message;
            }
        }
        return _testFolders;
    }

В этом приложении уже были применены модульные тесты с использованием MSTest;этот метод вызывается в настройке теста [ClassInitialize] и выполняется без проблем, однако попытки вызвать метод из метода шага SpecFlow по-прежнему возвращают то же исключение.

Я пытаюсь понять проблему здесь.Есть ли что-то конкретное для тестирования SpecFlow или NUnit, которое я пропустил?

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Я думаю, что просто не нравится запись с двойной точкой, используйте Environment.CurrentDirectory или просто сделайте следующее:

DirectoryInfo cd = new DirectoryInfo(Environment.CurrentDirectory);
cd.CreateDirecory("TestFolder1"); // creates a relative Directory
0 голосов
/ 05 июня 2018

Итак, как оказалось, проблема была с NUnit.Тесты, выполненные с помощью MSTest, возвращают папку bin тестового проекта как Environment.CurrentDirectory, "C: \ Code [test_project_folder] \ bin \ Debug";тесты, выполненные с помощью NUnit, возвращают "C: \ PROGRAM FILES (X86) \ MICROSOFT VISUAL STUDIO 14.0 \ COMMON7 \ IDE \ COMMONEXTENSIONS \ MICROSOFT \ TESTWINDOW".Проблема отказа в доступе возникла из-за того, что CurrentDirectory является подкаталогом папки «Program Files (x86)».

Чтобы обойти эту проблему, я добавил строковый параметр testDirectory в свой вспомогательный метод...

public static string[] CreateTestFolders(string testDirectory)
{
    _testFolders = new string[] { @"TestFolder1", @"TestFolder2", @"TestFolder3", @"TestFolder4", @"TestFolder5" };

    for (int i = 0; i < _testFolders.Length - 1; i++)
    {
        try
        {
            _testFolders[i] = Directory.CreateDirectory(testDirectory + _testFolders[i]).FullName;
        }
        catch(Exception ex)
        {
            string exm = Environment.UserName + " " + ex.Message;
        }
    }
    return _testFolders;
}

... и обновил мой вызов метода для передачи AppDomain.CurrentDomain.BaseDirectory в качестве аргумента ...

_testFileFolders = StepHelper.CreateTestFolders(AppDomain.CurrentDomain.BaseDirectory);

Это исправление дало результат, который я преследовал.

0 голосов
/ 05 июня 2018

Попробуйте использовать

public static string[] CreateTestFolders()
{
    _testFolders = new string[] { @"TestFolder1", @"TestFolder2", @"TestFolder3", @"TestFolder4", @"TestFolder5" };

    for (int i = 0; i < _testFolders.Length - 1; i++)
    {
        try
        {
            // Also try with Application.StartupPath instead of Directory.GetCurrentDirectory()
            string currentPath = Path.Combine(Directory.GetCurrentDirectory(), _testFolders[i]);
            if (!Directory.Exists(currentPath)
            {
                Directory.CreateDirectory(currentPath);
            }
            //at this point your folder should exist
        }
        catch(Exception ex)
        {
            string exm = Environment.UserName + " " + ex.Message;
        }
    }
    return _testFolders;
}

Попробуйте использовать DirectorySecurity, как указано в MSDN .У меня была такая же проблема при создании каталога.Я использовал DirectorySecurity, как показано ниже:

// Define Security Rules
var securityRules = new DirectorySecurity();
securityRules.AddAccessRule(new 
FileSystemAccessRule(@"Domain\AdminAccount1", FileSystemRights.Read, AccessControlType.Allow));
// ...

// ...
// Use the security rules while creating directory
var directoryInfo = Directory.CreateDirectory(_testFolders[i], securityRules);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...