2

関数の 1 つが特定のメッセージ (または警告、またはエラー) を出すことをテストしたいと思います。

good <- function() message("Hello")
bad <- function() message("Hello!!!!!")

最初の期待が成功し、2 番目の期待が失敗することを望みます。

library(testthat)
expect_message(good(), "Hello", fixed=TRUE)
expect_message(bad(), "Hello", fixed=TRUE)

残念ながら、どちらも現時点ではパスしています。

明確にするために:これは、私がテストしている正確なメッセージではなく、最小限の例であることを意図しています。可能であれば、テストするすべての新しいメッセージに対して適切な正規表現を考え出す必要があるため、テスト スクリプトに複雑さ (およびおそらくエラー) を追加することを避けたいと考えています。

4

2 に答える 2

7

^および$アンカーを使用して、文字列がパターンで開始および終了する必要があることを示すことができます。

expect_message(good(), "^Hello\\n$")
expect_message(bad(), "^Hello\\n$")
#Error: bad() does not match '^Hello\n$'. Actual value: "Hello!!!!!\n"

は、追加\\nする新しい行と一致させるために必要ですmessage

警告については、改行がないため、少し単純です。

expect_warning(warning("Hello"), "^Hello$")

エラーの場合は少し難しくなります:

good_stop <- function() stop("Hello")
expect_error(good_stop(), "^Error in good_stop\\(\\) : Hello\n$")

正規表現のメタ文字、つまり. \ | ( ) [ { ^ $ * + ?はエスケープする必要があることに注意してください。


または、フリック氏の回答hereから借りて、メッセージを文字列に変換してから、、などを使用することもできexpect_trueますexpect_identical

messageToText <- function(expr) {
  con <- textConnection("messages", "w")
  sink(con, type="message")
  eval(expr)
  sink(NULL, type="message")
  close(con)
  messages
}

expect_identical(messageToText(good()), "Hello")
expect_identical(messageToText(bad()), "Hello") 
#Error: messageToText(bad()) is not identical to "Hello". Differences: 1 string mismatch
于 2014-06-29T13:28:41.790 に答える