testにexpect_no_warnings()のようなものはありますか?
質問
ある条件下で警告が生成される関数のテストを作成しています。他の条件下では警告が生成されないことを確認したいと考えています。それを簡単にテストする明確な方法がわかりません testthat
. 。次のようなことができると思います:
my.result <- 25
my.func <- function() my.result
expect_equal(
withCallingHandlers(
my.func(), warning=function() stop("A Warning!")
),
my.result
)
または使用します options(warn=2)
, 、しかし、私は次のようなものがあることを期待していました:
expect_no_warnings(my.func())
明らかな何かを見逃しているでしょうか?
解決
'Testthat''tthat''tthat''/hadley/testthat/releases/tag/v0.11.0"> 0.11.0 からの
やる:
expect_warning(my.func(), regexp = NA)
.
expect_error
regexp:テストに対する正規表現。省略した場合は、コードがいくつかの出力、メッセージ、警告、またはエラーを生成すると主張します。あるいは、出力、メッセージ、警告、またはエラーがないことを示すためにNAを指定できます。
SOと同じように、メッセージがないこと、エラー、および出力がないことをテストできます。
他のヒント
TestThatの最近のバージョンでは、簡単にすることができます。
expect_that(my.func(), not(gives_warning()))
. アップデート: 使用 expect_silent()
今日ではなぜなら expect_that
は非推奨です。関数のヘルプを参照してください。
更新 2: @eaglefreemanによって言及されたように を使った答え expect_warning
パラメータ付き regexp
に設定 NA
私の答えでは、警告が表示されずにメッセージが出力されただけでもテストが失敗するため、これが最良の解決策です。これは OP が望んでいることではありません (ただし、警告は無視してください)。この違いを他の読者に明確にするために、この回答は削除しません。
ヘルプの例から:
expect_silent("123")
f <- function() {
message("Hi!")
warning("Hey!!")
print("OY!!!")
}
expect_silent(f())
警告: expect_silent
また、出力が期待されていないため、セマンティクスが少し異なります。
expect_warning()
が失敗するかどうかを確認できます。以下は、my.func()
とnot()
によって生成されている他の種類の出力の問題を解決しました。
expect_failure(expect_warning(my.func()))
.