9

警告の順序が異なる場合に、関数が複数の警告 (4 つ以上) を生成することをテストしたいと考えています。これを行うための私の最善の試みは、先読みの RegExp マッチングに基づいています。2 つの警告に単純化すると、次の両方が当てはまるため、RegExp が単一の文字列出力で機能することがわかります。

grepl("(?s)(?=.*2)(?=.*1)", "* warn 1.\n* warn 2.", perl=TRUE)
grepl("(?s)(?=.*2)(?=.*1)", "* warn 2.\n* warn 1.", perl=TRUE)

ただし、複数の警告をテストする場合、これは機能しませんtesthat::expect_warning

# The function generating warnings:
foo <- function() { warning("warn 1."); warning("warn 2.") }
foo()
Warning messages:
1: In foo() : warn 1.
2: In foo() : warn 2.

# Testing it
expect_warning( foo(), "(?s)(?=.*1)(?=.*2)", perl=TRUE)

Error: foo() does not match '(?s)(?=.*1)(?=.*2)'. Actual values:
* warn 1.
* warn 2.

これは、の内部がexpect_warning、指定された RegExp を各警告に対して個別にテストするようなことを行っているためだと思われます。なぜexpect_warning( ... all=TRUE )パラメーターが意味を持つのか.

残念ながら、これは"1 | 2";のような RegExp では使用できません。これは、警告が 1 つだけ出された場合に成功します。

また、関数を複数回実行して、毎回異なる警告をテストすることも避けたいと考えています。実際の機能をテストするには、大量のセットアップおよび分解コードが必要です。これはファイル システムと頻繁に相互作用します。これは、私がテストしているファイル システムの警告であるため、それをあざけることはできません。さらに、複数の状況で警告をテストしたいのですが、それぞれが異なるセットアップと分解コードを必要とするため、テストがすぐに肥大化します。

複数の警告を簡単に一度にテストする方法について何か提案はありますか?

4

3 に答える 3

0

[12]次のようなものを使用できます。

expect_warning( foo(),'(?s)(?=.*[12])' , all=T, perl=TRUE)
于 2016-03-01T00:48:23.510 に答える