2016-07-19 5 views
0

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

テスト中にこれらの一時停止を回避する方法はありますか?心に来るが、私はそれらを実装する方法を知っているではないでしょう

アプローチ:

  • 無効対話モードRは
  • が非でスクリプトを実行しますtestthatパッケージから別の関数を使用して実行している間対話モード
  • は何とか、端末以外の何かにstdinをそらす(??)私のTESから非対話モードで呼び出された別のスクリプトでreadline()を呼び出す
  • ラップ機能結果を利用可能にする

Rscriptを使用してコマンドラインからのみテストすることはオプションですが、私はRStudioワークフローに留まりたいと思います。

======

サンプルコード

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

私は今、コマンドラインからテストに固執します。あまりにも面倒ではありませんが、ワークフローの点でまだ解決策ではありません。 – Niels

答えて

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)が助けになります:

関連する問題