0

パッケージのtest_dir()関数を使用してRでテストを実行しています。testthat一部のテスト スクリプトには、 を呼び出す関数がありreadline()、対話モードでは、テストを一時停止してユーザー入力を待ちます。関数呼び出しreadline()は私自身のものではなく、私はそれらに影響を与えません。ユーザー入力は、これらの関数の出力には関係ありません。

テスト中にこれらの一時停止を回避する方法はありますか?

頭に浮かぶアプローチですが、それらを実装する方法はわかりません:

  • R の実行中に対話モードを無効にする
  • testthat非対話モードでスクリプトを実行するパッケージの別の関数を使用する
  • なんとかstdin端末以外に流用(??)
  • readline()テストスクリプトから非インタラクティブモードで呼び出され、結果を利用できるようにする別のスクリプトで呼び出す関数をラップします

を使用してコマンド ラインからのみテストRscriptすることもできますが、RStudio ワークフローにとどまることをお勧めします。

======

サンプルコード

with_pause <- function () {  
  readline() 
  2
}
without_pause <- function () {
  2
}
expect_equal(with_pause(), without_pause())
4

1 に答える 1

1

同様の問題があります。グローバルオプション設定で解決しました。

original_test_mode <- getOption('my_package.test_mode')
options('my_package.test_mode' = TRUE)
# ... some tests ...
options('my_package.test_mode' = original_test_mode)

私のスクリプトには、ifステートメントがあります

if(getOption('my_package.test_mode', FALSE)) {
  # This happens in test mode
  my_value <- 5
} else {
  # normal processing
  my_value <- readline('please write value: ')
}

また、最も良い方法ではありませんが、私にとってはうまくいきます。

たぶん、もう1つのヒント。たまたまテストスクリプトが失敗しました。ここでの問題は、グローバル オプションが残りTRUE、次のラウンドでも、同じセッションでスクリプトを実行する場合でも、値を書き込むように求められないことです。tryCatch関数などに何かを入れるべきだと思います。ただし、この問題を念頭に置いている場合は、「時々」だけでoptions('my_package.test_mode', NULL)役立ちます:-)

于 2016-09-19T06:14:48.713 に答える