Как лучше всего проводить модульное тестирование testthat
функций, которые читают и записывают файлы?
Приносим извинения за сложный вопрос, но я не уверен, что здесь не так.
Я реализовал ряд функций в Фортране, который читает и записывает файлы. Они скомпилированы в пакете R cf. Написание руководства по расширению R. Мое модульное тестирование с testthat
генерирует случайный контент, который записывается во временные файлы с помощью tempfile (). Выполнение проверки R CMD в пакете R работает на моем локальном компьютере с Windows.
Однако запуск с R-devel завершается ошибкой, потому что он не может обнаружить Rtools для R-3.5.0 (devel). Итак, я подал заявку на участие в win-builder.
Однако http://win-builder.r-project.org/ не работает со следующим ошибка:
At line 9 of file auxil.f95
Fortran runtime error: Actual string length is shorter than the declared one for dummy argument 'fn' (96/255)
с соответствующим источником на Фортране:
subroutine get_nlines(fn, nlines, stat) !line 9
implicit none
!! Arguments
character(255), intent(in) :: fn
integer, intent(out) :: nlines, stat
!! Local variables
character(len=1) :: one
nlines = 0
open(40, file=fn, status='OLD')
do
read(40, *, iostat=stat) one
if (stat /= 0) exit
nlines = nlines + 1
end do
close(40)
end subroutine
Код Fortran хранится в подкаталоге src
пакета R и вызывается с помощью
get_nlines <- function(fn) {
stopifnot(file.exists(fn))
res <- .Fortran('get_nlines', fn=as.character(fn), nlines=integer(1), stat=integer(1))
if (res$nlines == 0 & res$stat != 0) {
warning(paste0('get_nlines did not read lines; IOSTAT error ', res$stat, '.'))
return(structure(NA, code=res$stat))
}
res$nlines
}
Итак, вот оно. Я не знаю, неправильный ли мой код Fortran или что-то происходит на сервере win-builder.
fn
этому коду R? Пожалуйста, нам нужно увидеть, откуда это взялось. На самом деле этого недостаточно. Мы просто знаем, чтоfn
должен содержать 255 символов. - person Vladimir F   schedule 12.09.2017testthat
? Как выглядит код, вызывающий указанную ошибку? Нам просто не хватает кода, вызывающего ошибку. - person Vladimir F   schedule 12.09.2017fn
- это вектор символов, возвращаемый изtempfile()
, и содержит путь к имени файла.testthat
вызывается с использованиемtest_check(<packagename>)
. - person MrGumble   schedule 12.09.2017fn
должно быть 255 символов. Почему написано именно так, а не какcharacter(*)
Понятия не имею. - person Vladimir F   schedule 12.09.2017