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?

Foi útil?

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()))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top