Печать пользовательской диагностической информации, если тест `testthat` не проходит в `R`

Я использую модульный тест testthat, чтобы проверить, идентичен ли data.frame, возвращаемый функцией, тому, который я ожидал бы вернуть. Если тест не пройден, testthat выводит некоторую диагностическую информацию, например:

MyFunction(df.orig) is not identical to df.expected. Differences: 
Names: 1 string mismatch

Однако мне бы очень хотелось увидеть фактический вывод функции, т.е. распечатать возвращенное data.frame. Есть ли способ распечатать вывод тестируемой функции (или другую пользовательскую диагностическую информацию), если тест testthat не пройден?


person severin    schedule 14.11.2014    source источник


Ответы (2)


Косвенно да! Если вы посмотрите на аргументы для expect_that, вы увидите параметр «info» — вы можете добавить сюда анонимную функцию или вызов, который выведет результаты. Итак, что-то вроде:

expect_that(df.orig, is_identical_to(df.expected), info = print(df.orig))

Недостатком этого является то, что он /всегда/ будет печатать df.orig или подобную информацию, даже если тест пройден.

Единственный другой способ сделать это (и единственный способ гарантировать, что он сработает только в случае возникновения ошибки) — это использовать tryCatch; что-то типа:

tryCatch(
    expr = {
        expect_that(df.orig, is_identical_to(df.expected))
    }, 
    error = function(e){
        print(e)
        print(df.orig)
        #And anything else you want to only happen when errors do
    }
)

Это выглядит намного неуклюже, но имеет пару преимуществ - он будет печатать df.orig только в том случае, если вызов expect_that выдает ошибку, вы можете выводить... ну, все, что хотите, и вы можете выводить разные результаты для ошибок. против предупреждений. Однако довольно грубый.

person Oliver Keyes    schedule 14.11.2014

вы можете сохранить результат expect_that во временной переменной b, проверить, нет ли ошибки внутри конструкции it, и вернуть b

b <- expect_that(df.orig, is_identical_to(df.expected))

if (!b$passed){

    #do something
}
person blset    schedule 12.03.2016