Existe algo no teste como expect_no_warnings()?
Pergunta
Estou escrevendo testes para uma função que, sob algumas condições, gerará avisos.Quero garantir que nas outras condições não produza avisos.Não vejo uma maneira óbvia de testar isso facilmente com testthat
.Acho que poderia fazer algo como:
my.result <- 25
my.func <- function() my.result
expect_equal(
withCallingHandlers(
my.func(), warning=function() stop("A Warning!")
),
my.result
)
ou usar options(warn=2)
, mas eu esperava que houvesse algo como:
expect_no_warnings(my.func())
Estou perdendo algo óbvio?
Solução
Em versões ainda mais recentes de 'testthat' (de 0.11.0) você pode fazer:
expect_warning(my.func(), regexp = NA)
Da documentação de expect_error
expressão regular:expressão regular para testar.Se omitido, apenas afirma que o código produz alguma saída, mensagem, aviso ou erro.Alternativamente, você pode especificar NA para indicar que não deve haver saída, mensagens, avisos ou erros.
Da mesma forma, você pode testar se não há mensagens, erros e saídas.
Outras dicas
Nas versões recentes do testthat, você pode simplesmente fazer:
expect_that(my.func(), not(gives_warning()))
Atualizar: Usar expect_silent()
hoje em dia porque expect_that
está obsoleto, consulte a ajuda para a função!.
Atualização 2: Conforme mencionado por @eaglefreeman a resposta usando expect_warning
com o parâmetro regexp
definido como NA
é a melhor solução, pois minha resposta faz com que o teste falhe, mesmo que nenhum aviso tenha sido gerado, mas apenas uma mensagem tenha sido impressa.Não era isso que o OP queria (mas apenas ignore os avisos).Não excluo esta resposta para deixar clara essa diferença para outros leitores.
Dos exemplos da ajuda:
expect_silent("123")
f <- function() {
message("Hi!")
warning("Hey!!")
print("OY!!!")
}
expect_silent(f())
Aviso: expect_silent
também não espera saída, então a semântica é um pouco diferente!
Você pode verificar se expect_warning()
falha.O que se segue resolve a questão de outro tipo de produção produzida por my.func()
e not()
sendo obsoleto:
expect_failure(expect_warning(my.func()))