2015-04-08 63 views
0

我想測試一個函數返回預期的data.frame。 data.frame太大而無法在R文件中定義(例如,使用諸如structure()之類的東西)。當我嘗試從磁盤進行簡單檢索時,我的環境出現問題,例如:檢索期望的data.frame測試期望

test_that("SO example for data.frame retreival", { 
    path_expected <- "./inst/test_data/project_longitudinal/expected/default.rds" 
    actual <- data.frame(a=1:5, b=6:10) #saveRDS(actual, file=path_expected) 
    expected <- readRDS(path_expected) 
    expect_equal(actual, expected, label="The returned data.frame should be correct") 
}) 

行在控制檯中運行時正確執行。但是當我運行devtools::test()時,從文件中讀取rds/data.frame時會發生以下錯誤。

1. Error: All Records -Default ---------------------------------------------------------------- 
cannot open the connection 
1: withCallingHandlers(eval(code, new_test_environment), error = capture_calls, message = function(c) invokeRestart("muffleMessage"), 
     warning = function(c) invokeRestart("muffleWarning")) 
2: eval(code, new_test_environment) 
3: eval(expr, envir, enclos) 
4: readRDS(path_expected) at test-read_batch_longitudinal.R:59 
5: gzfile(file, "rb") 

爲了做到這一點,需要對環境進行哪些調整?如果沒有簡單的方法,測試大型數據框架的好方法是什麼?

+1

我沒有使用過這個(因此未經測試),但'system.file()'不適用於此?它允許您指定一個包,然後指定從包基到文件的路徑位。所以給'path_expected < - system.file(「inst」,「test_data」,「project_longitudinal」,expected「,」default.rds「)'嘗試... –

+0

這有助於我分心環境,忘記了測試過程改變了工作目錄,出於某種原因,我遇到了'path_qualified < - base :: system.file(「inst/test_data/project_longitudinal/expected/dummy.rds」,package =「REDCapR」)的問題。 'path_qualified < - base :: file.path(devtools :: inst(name =「REDCapR」),「test_data/project_longitudinal/expected/dummy.rds」)'如果你發佈一個正式的答案指向我的工作目錄問題,我很樂意接受它 – wibeasley

回答

0

根據@Gavin Simpson的評論,該問題不涉及環境,而是文件路徑。更改snippet's second line工作。

path_qualified <- base::file.path(
    devtools::inst(name="REDCapR"), 
    test_data/project_longitudinal/expected/dummy.rds" 
) 

該文件的位置找到我是否調試交互,或testthat運行(因此inst是否在路徑或沒有)。

2

我建議你看看優秀的ensurer包。您可以將這些功能包含在功能本身中(而不是作爲testthat測試裝置的一部分)。 如果數據框(或任何你想檢查的對象)不能滿足你的要求,它會拋出一個錯誤,並且只要它通過了你的測試就返回對象。 與testthat的不同之處在於ensurer是爲了在運行時檢查對象而設計的,它可能會避免您面臨的整個環境問題,因爲對象在運行時在函數內部進行了測試。 請參閱this vignette的末尾,瞭解如何根據您可以製作的模板測試數據幀的詳細程度。你還可以找到許多其他的測試,你可以在這個函數中運行。在這種情況下,看起來這種方法可能優於testthat

+0

感謝您處理更大的圖片@Peter Verbeet,我將文件路徑解決方案標記爲答案,因爲它更直接地解決了這個具體問題,但是我很高興我瞭解到了'ensurer ''''''''''''''''''''''''''''''''''''''''''''在未來的包裝和計劃中ms像是一種快速使測試套件更加細化的好方法。這將允許套件識別何時返回的結構是正確的,但值不是(並因此更直接地指向問題代碼)。 – wibeasley