2016-04-11 87 views
6

我正在構建一個可與data.table一起使用的包,並且應該使用包testthat進行測試。 雖然代碼在從命令行調用時工作正常,但從測試用例調用時遇到問題。在運行測試時,似乎使用基本包的[]函數,即data.frames的函數。r - data.table和testthat包

我創建了可以在這裏找到最小例如:https://github.com/utalo/test_datatable_testthat

的包都包含一個功能:

test <- function() { 
    dt <- data.table(MESSAGE="Test 1234567890",TYPE="ERROR") 
    dt[,.(MESSAGE=strwrap(MESSAGE,width = 10)),by=.(TYPE)] 
} 

當在命令行我得到預期的結果調用test.datatable.testthat:::test()

TYPE MESSAGE 
1: ERROR  Test 
2: ERROR 1234567890 

但是,執行以下單元測試時:

test_that("Test package",{ 
    dt <- test() 

    expected_res <- structure(list(TYPE = c("ERROR", "ERROR"), 
          MESSAGE = c("Test","1234567890")), 
         row.names = c(NA, -2L), class = c("data.table","data.frame"), 
         .Names = c("TYPE", "MESSAGE")) 

    expect_equal(dt,expected_res) 
}) 

我得到一個錯誤:

1 
1. Error: Test package ------------------------------------------------------------------------------------------------------- 
could not find function "." 
1: withCallingHandlers(eval(code, new_test_environment), error = capture_calls, message = function(c) invokeRestart("muffleMessage")) 
2: eval(code, new_test_environment) 
3: eval(expr, envir, enclos) 
4: test() at test.R:4 
5: dt[, .(MESSAGE = strwrap(MESSAGE, width = 10)), by = .(TYPE)] at test.datatable.testthat/R/hello.R:5 
6: `[.data.table`(dt, , .(MESSAGE = strwrap(MESSAGE, width = 10)), by = .(TYPE)) at C:\Users\D057806\Documents\R\test.datatable.testthat/R/hello.R:5 
7: `[.data.frame`(x, i, j) 

正如你所看到的,在測試中的[] data.frame中被調用。 我的第一個猜測是,data.table包的依賴沒有被正確聲明。這是我的說明文件:

Package: test.datatable.testthat 
Type: Package 
Title: What the Package Does (Title Case) 
Version: 0.1 
Date: 2016-04-07 
[email protected]: person("First", "Last", email = "[email protected]", role = c("aut", "cre")) 
Description: More about what it does (maybe more than one line) 
License: What license is it under? 
LazyData: TRUE 
Depends: 
    data.table 
Suggests: 
    testthat 
RoxygenNote: 5.0.1 

根據Using data.table package inside my own package它應該是足夠的申報data.table作爲一個依賴包。但是,這似乎並不是這種情況。

任何線索,爲什麼我的函數是直接調用但不是在testthat的情況下工作?

+0

,此問題仍然存在,如果你* *進口data.table,並添加'進口(data.table)'來命名空間?我問,因爲[這篇文章](http://stackoverflow.com/a/23279604/559784)想到..我猜這是與'testthat'相同的問題。 – Arun

+0

@Arun感謝您的指針!這似乎是問題的一部分。如果我更改了要導入的depends語句,它在測試示例中起作用,但不是在我的原始代碼中。我將在示例中嘗試重現此行爲。 – utal

+0

這是新的..你還添加導入(data.table)到你的NAMESPACE? – Arun

回答

0

要發表評論,所以張貼爲答案。

  1. 不要在包名中使用下劃線,它會打破標準。下劃線將變成點。

  2. 真的不能告訴你爲什麼testthat無法處理你的測試。您可以嘗試導出test功能。它不會被導出,所以只能用於明確使用:::。也許testthat以某種方式依賴於此,不知道。

  3. 當我將測試移出testthat時,測試通過。如果你沒有解決它,我會在測試中尋求支持。

你可以看到我對你的PKG叉jangorecki/test_datatable_testthat(URL不會在幾天內從現在的工作,如果你想稍後訪問他們,所以取了變化)。
您的測試已移出tests/test.R測試,其內容如下。

dt <- test.datatable.testthat:::test() 
expected_res <- structure(list(TYPE = c("ERROR", "ERROR"), 
           MESSAGE = c("Test","1234567890")), 
          row.names = c(NA, -2L), class = c("data.table","data.frame"), 
          .Names = c("TYPE", "MESSAGE")) 
stopifnot(all.equal(dt,expected_res)) 

Testthat試驗是通過改變它來模擬,種TRUE==TRUE抑制。 現在您的測試在測試之外定義,並通過OK。
相關部分從00check.log

* checking tests ... 
    Running ‘test.R’ 
    Running ‘testthat.R’ 
OK 
* DONE 
+0

ad 2.之前我已經成功測試了非導出函數,所以我不認爲問題出現在那裏。廣告3.我看了一下testthat的問題。似乎有關於相關問題https://github.com/hadley/devtools/issues/192是否已解決的討論,例如,這裏http://stackoverflow.com/questions/23252231/r-data-table-breaks-in-exported-functions – utal