2015-12-04 3 views
4

Предположим, я хочу обычай testthat ожидания. Например, я тестирую множество объектов, чтобы увидеть, нет ли у них отсутствующих значений. testhat способ написания вещей должно быть что-то вроде этого:Как вы можете протестировать пользовательское ожидание?

expect_no_nas <- function(object, info = NULL, label = NULL) 
{ 
    lab <- testthat:::make_label(object, label) 
    expect(has_no_nas(object), sprintf("%s has nulls.", lab), 
    info = info) 
    invisible(object) 
} 

has_no_nas <- function() 
{ 
    !any(is.na(x)) 
} 

Как проверить, что это правильно?

Я могу написать тесты, которые проходят, без проблем.

test_that(
    "expect_no_nas passes when there are no NAs", 
    { 
    expect_no_nas(1:5) 
    } 
) 

Я думал, что я мог бы обернуть пользовательские ожидания в expect_error, но это не работает:

test_that(
    "expect_no_nas fails when there are NAs", 
    { 
    expect_error(expect_no_nas(c(1, NA))) 
    } 
) 
## Error: Test failed: 'expect_no_nas fails when there are NAs' 
## * Not expected: c(1, NA) has NAs. 
## * Not expected: expect_no_nas(c(1, NA)) code raised an error. 

Подведем в try не работает.

test_that(
    "expect_no_nas fails when there are NAs", 
    { 
    res <- try(expect_no_nas(c(1, NA))) 
    expect_false(res$passed) 
    } 
) 
## Error: Test failed: 'expect_no_nas fails when there are NAs' 
## Not expected: c(1, NA) has NAs.  

Как проверить наличие неисправных футляров? (Важно помнить, что мы проверяем, работает ли expect_no_nas, а не только для написания тестов, которые используют expect_no_nas.)

+0

Я немного озадачен ... каков будет ваш ожидаемый результат? Функция дает ошибку, когда есть NA ... как предполагается, или я не понимаю, что вы пытаетесь сделать? – nico

+0

Да, 'expect_no_nas' должен давать ошибку, когда есть NA. Но так как я хочу проверить функцию 'expect_no_nas', мне нужен мета-тест. То есть, (проходящий) тест, который проверяет, что 'expect_no_nas' завершился неудачно. Перечитав это, я понимаю, почему вы озадачены. –

+0

Хорошо, теперь я понимаю, что вы имеете в виду! – nico

ответ

4

Запрос Нико помогает прояснить ситуацию: вам нужен тест внутри теста.

test_that(
    "expect_no_nas fails when there are NAs", 
    { 
    expect_error(
     test_that(
     "failing test", 
     { 
      expect_no_nas(c(1, NA)) 
     } 
    ) 
    ) 
    } 
) 
Смежные вопросы