9

data.table で動作し、パッケージ testthat を使用してテストする必要があるパッケージを作成しています。コマンド ラインから呼び出すとコードは正常に動作しますが、テスト ケースから呼び出すと問題が発生します。テストの実行時に、ベース パッケージの [] 関数、つまり data.frames の関数が使用されているようです。

ここにある最小限の例を作成しました: 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
Authors@R: person("First", "Last", email = "first.last@example.com", 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 のコンテキストではなく、直接呼び出されたときに関数が機能する理由についての手がかりはありますか?

4

1 に答える 1

0

コメントを待ち望んでいるので、回答として投稿してください。

  1. パッケージ名にアンダースコアを使用しないでください。標準に違反しています。アンダースコアはドットに変わります。

  2. testthat がテストの処理に失敗した理由を正確に伝えることはできません。関数のエクスポートを試すことができtestます。:::エクスポートされないため、明示的にのみ使用する必要があります。おそらくtestthatは何らかの形でそれに依存していますが、わかりません。

  3. テストをtestthatの外に移動すると、テストは合格です。解決できない場合は、testthat の問題でサポートを探します。

あなたの pkg の私のフォークjangorecki/test_datatable_testを見ることができます (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))

テストは、ダミーのようなものに変更することでテストが抑制されTRUE==TRUEます。これで、testthat の外側で定義されたテストが OK に合格しました。
からの関連部分00check.log:

* checking tests ...
  Running ‘test.R’
  Running ‘testthat.R’
 OK
* DONE
于 2016-04-11T11:49:44.750 に答える