5

接続を生成する関数の単体テストを検討しています。実行中に接続の詳細を含むメッセージを出力します。

以下をテストしたい:

  1. メッセージは期待どおりに表示されます ( expect_message(fn(),"blah"))
  2. エラーはありません ( expect_error(fn(),NA))
  3. 作成されたオブジェクトは特定のクラスです ( expect_is(fn(),"PostgreSQLConnection"))

私はres<-fn()それを実行してexpect_is()から実行することができましたが、関数を呼び出している間にメッセージとエラー (の欠如) の両方でテストを実行するにはどうすればよいでしょうか。

理想的には、3 つすべてを同時に評価し、後で安全に接続を閉じることができるようにしたいと考えています。

library(testthat)
fn<-function(){
  message("blah")
  obj<-"blah"
  class(obj)<-c("PostgreSQLConnection",class(obj))
  return(obj)
}

expect_message(fn(),"blah")
expect_error(fn(),NA)
expect_is(fn(),"PostgreSQLConnection")

PSexpect_messageおよび関数は、非推奨であるかどうかにかかわらず、次のexpect_errorような関数を使用します。ドキュメントはその点で少し混乱しています。throws_error?throws_error

4

2 に答える 2

4

を使用testthat::evaluate_promiseすると、関数呼び出しのさまざまな側面を取得し、結果を保存してから、テストする必要がある項目をテストできます。

この場合、コードは次のようになります。

library(testthat)

fn<-function(){
  message("blah")
  obj<-"blah"
  class(obj)<-c("PostgreSQLConnection",class(obj))
  return(obj)
}

res<-evaluate_promise(fn())

expect_equal(res$messages,"blah")
expect_equal(res$warnings,character())
expect_s3_class(res$result,"PostgreSQLConnection")
于 2016-03-31T12:06:29.853 に答える