2017-03-14 96 views
5

我想添加一些測試到我的包,以確保事情保持原樣,當我做出更改。我在這方面遇到了一些困難。testthat使用檢查失敗()

我想測試我的包的主要功能,它可以粗略地描述爲一種插補方法。所以,如果我舉一個n x 2矩陣Y它在第二列有一些NA,它應該返回Z其中YZ第一列是相同的(因爲它是完全觀察到的),第二欄應估算,以便有在Z的第二列中沒有NA

顯然,還有其他一些函數的輸入,但我的測試的主要結構是

context("Test output") 
test_that("First column equal", { 
    set.seed(100) 
    Y <- matrix(rnorm(200), 100, 2) 
    Y[seq(1, 100, by = 3), 2] <- NA 
    out <- my_fun(Y) 
    expect_equal(Y[, 1], out[, 1]) 
}) 

我的問題是,這是行不通的。它運行時,我運行devtools::test(),但不是運行時devtools::check()。我嘗試使用expect_equal_to_reference()(因爲我真正想測試的比這個例子更大更強大),但是它也會引發錯誤,儘管在控制檯中運行代碼並與保存的.rds文件進行比較顯示它們是相同的。

我發現這句話被哈德利(under tests):

有時你可能會在那裏與devtools運行 當交互::測試(測試通過)的問題,但未能中的R CMD檢查時。 這通常表示您已經對測試環境做出了錯誤的假設,並且很難弄明白。

它不是好兆頭,但我能做什麼?有任何想法嗎?

這裏是我的錯誤(test_file是包含上述代碼的文件的名稱):

checking tests ... 
** running tests for arch 'i386' ... ERROR 
Running the tests in 'tests/testthat.R' failed. 
Last 13 lines of output: 
    3: asNamespace(ns) 
    4: getNamespace(ns) 
    5: tryCatch(loadNamespace(name), error = function(e) stop(e)) 
    6: tryCatchList(expr, classes, parentenv, handlers) 
    7: tryCatchOne(expr, names, parentenv, handlers[[1L]]) 
    8: value[[3L]](cond) 
... 13 lines ... 
    5: tryCatch(loadNamespace(name), error = function(e) stop(e)) 
    6: tryCatchList(expr, classes, parentenv, handlers) 
    7: tryCatchOne(expr, names, parentenv, handlers[[1L]]) 
    8: value[[3L]](cond) 

    testthat results ================================================================ 
    OK: 0 SKIPPED: 0 FAILED: 1 
    1. Error: First column equal (@test_file.R#12) 
+0

要嘗試任何調試,簡化的'my_fun()'(但仍然失敗測試)將是有用的。 –

+0

@ m-dz我明白,但是這個函數非常複雜,整個包(或多或少)只包含它的構建塊。我知道沒有它就問這個問題是一個漫長的過程,但我希望有人經歷過類似的事情。 – hejseb

+0

也許嘗試(在https://github.com/hadley/testthat/issues/86後):「只需將'Sys.setenv(」R_TESTS「=」「)'添加爲'tests/testthat.R'中的第一行」。 –

回答

3

答案是令人尷尬的,因爲它很簡單。該軟件包需要在測試文件被加載,所以它應該開始:

library(mypackage) 
context("Test output") 

儘管我認爲它的工作之前,它實際上沒有。現在該軟件包已正確加載,我可以看到例如生成窗格中會出現my_fun打印的進度條。