Как File.Exists в Nunit Test - PullRequest
       2

Как File.Exists в Nunit Test

4 голосов
/ 22 декабря 2010

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

Private Sub AddHeaderToLogFile()
    ''#Only if file does not exist
    If Not File.Exists(_logPath) Then
        Dim headerLogger As Logger
        headerLogger = LogManager.GetLogger("HeaderLogger")
        ''#Use GlobalDiagnosticContext in 2.0, GDC in pre-2.0
        NLog.GlobalDiagnosticsContext.Set("appName", _appName)
        NLog.GlobalDiagnosticsContext.Set("fileVersion", _fileVersion)
        NLog.GlobalDiagnosticsContext.Set("logId", 0)
        headerLogger.Info("")
    End If
End Sub

Идея состоит в том, что если файл не существует, то файлгенерируется при обращении к экземпляру регистратора NLog, после чего файл создается и вставляется указанная информация заголовка.Метод отлично работает из самого приложения, однако у меня есть простой тест NUnit, который реализует метод теста, чтобы проверить, что файл создан и заполнен, как и ожидалось.Проходя через отладчик, я обнаружил, что для параметра _logPath установлено значение:

D: \ Documents and Settings \ TE602510 \ Локальные настройки \ Temp \ nunit20 \ ShadowCopyCache \ 4288_634286300896838506 \ Tests_-1937845265 \ assembly \dl3 \ 7cdfe61a \ aa18c98d_f0a1cb01 \ logs \ 2010-12-22.log

К сожалению, несмотря на то, что файл существует, вызов File.Exists возвращает false.При более раннем просмотре пути конфигурации указанный путь будет правильным для этих тестов NUnit.Кто-нибудь знает, что здесь происходит и что мне нужно сделать, чтобы получить желаемый результат?Путь к файлу журнала в соответствии с файловой системой XP:

D: \ Documents and Settings \ TE602510 \ Мои документы_VSSWorkArea \ PsalertsIp \ Tests \ bin \ Debug \ logs

С уважением

Пол Дж.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2010

Не использовать File.Exists!

Файловая система изменчива, и поэтому наличие (или отсутствие) искомого файла может измениться между проверкой и воздействием на результаты. Кроме того, File.Exists ничего не делает, чтобы определить, есть ли у вас правильные разрешения для рассматриваемого файла.

Вместо этого вы просто попытаетесь правильно открыть файл, например:

Try
    Using fs As IO.FileStream = IO.File.Open(_logPath, FileMode.CreateNew)

    End Using
Catch ex AS IOException 
    ''# This will be thrown if the file already exists - just swallow it
    ''# If you also want to handle IOExceptions while working on the file,
    ''#  place another try/catch inside the using block
End Try

File.Exists следует использовать только тогда, когда само существование файла имеет смысл, но файл никогда не будет фактически прочитан или записан. Например, некоторые системы основных кадров будут создавать и уничтожать файлы для обозначения блокировок или для оповещения о завершении задания.

0 голосов
/ 22 декабря 2010

Это может быть проблема с разрешением. От MSDN , File.Exists(path) возвращается:

true , если у вызывающей стороны есть необходимые разрешения и path содержит имя существующего файла; в противном случае неверно . Этот метод также возвращает false , если path является пустой ссылкой ( Nothing в Visual Basic), неверным путем или строкой нулевой длины. Если у вызывающей стороны недостаточно прав для чтения указанного файла, исключение не выдается, и метод возвращает false независимо от наличия path .

EDIT Вот два метода, которые попытаются получить ACL каталога / файла. Вполне возможно, что способ, которым NUnit вызывается, что права различаются.

Private Shared Function DoesFileExist(ByVal file As String) As Boolean
    Try
        Dim FI As New System.IO.FileInfo(file)
        Dim AC = FI.GetAccessControl()              'This method will fail if the file is not found'
        Return True
    Catch ex As System.IO.FileNotFoundException     'FNF error should be thrown if it does not exist'
        Return False
    Catch ex As Exception
        'If you do not have permission to read the permissions this might throw, too.'
        'Of course, in that situation that means that the file exists so we should'
        'probably return True here, too. For debugging I am still throwing though.'
        Throw ex
    End Try
End Function
Private Shared Function DoesDirectoryExist(ByVal dir As String) As Boolean
    Try
        Dim DI As New System.IO.DirectoryInfo(dir)
        Dim AC = DI.GetAccessControl()               'This method will fail if the directory is not found'
        Return True
    Catch ex As System.IO.DirectoryNotFoundException 'DNF error should be thrown if it does not exist'
        Return False
    Catch ex As Exception
        'If you do not have permission to read the permissions this might throw, too.'
        'Of course, in that situation that means that the directory exists so we should'
        'probably return True here, too. For debugging I am still throwing though.'
        Throw ex
    End Try
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...