2016-07-19 50 views
0

我使用testthat軟件包中的test_dir()函數在R中運行測試。在一些測試腳本中,有一些功能調用readline(),這些功能在交互模式下會導致測試暫停並等待用戶輸入。調用readline()的函數不是我自己的,我對它們沒有任何影響。用戶輸入與這些功能的輸出無關。在測試時避免由於readline()造成的暫停

有沒有辦法在測試過程中避免這些暫停?

途徑浮現在腦海中,但我不知道如何來實現:

  • 禁用交互模式,而R的運行
  • 使用其他功能,從在非運行腳本testthat包交互模式
  • 莫名其妙地轉移stdin比終端別的東西(??)
  • 保鮮功能在另一個腳本調用readline()是在非交互模式稱爲從我的TES並使結果可用

僅從命令行使用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: ') 
} 

而且不是最好的方式,但它爲我工作。

也許多一個提示。它發生在我的測試腳本失敗。這裏的問題是,全局選項保持爲TRUE,並且在下一輪中,並且在同一會話中執行腳本時,它永遠不會提示您寫入值。我想我應該把一些東西放在tryCatch函數左右。但如果你有這個問題,只是「有時」options('my_package.test_mode', NULL)幫助:-)