2017-03-14 93 views
5

Próbuję dodać do mojego pakietu kilka testów, aby upewnić się, że rzeczy pozostaną niezmienione po wprowadzeniu zmian. Mam pewne trudności w robieniu tego.Testuj tę awarię, używając funkcji check()

Chcę przetestować główną funkcję mojej paczki, którą można z grubsza określić jako metodę imputacji. Więc jeśli podam n x 2 matrycę Y do niego gdzie druga kolumna ma kilka NA, powinien on powrócić Z gdzie pierwsze kolumny Y i Z są takie same (ponieważ jest całkowicie przestrzegane), a druga kolumna powinna być przypisane tak, że istnieją nr NA w drugiej kolumnie Z.

Oczywiście, istnieje wiele innych wejść do funkcji, ale podstawowa struktura mojego testu jest

context("Test output") 
test_that("First column equal", { 
    set.seed(100) 
    Y <- matrix(rnorm(200), 100, 2) 
    Y[seq(1, 100, by = 3), 2] <- NA 
    out <- my_fun(Y) 
    expect_equal(Y[, 1], out[, 1]) 
}) 

Moim problemem jest to, że nie działa. Działa po uruchomieniu devtools::test(), ale nie przy uruchomieniu devtools::check(). Próbowałem użyć expect_equal_to_reference() (ponieważ to, co naprawdę chcę przetestować, jest większe i bardziej skomplikowane niż w tym przykładzie), ale także powoduje błąd, pomimo uruchomienia kodu w konsoli i porównania z zapisanym plikiem .rds pokazuje, że są one identyczne.

znalazłem ten cytat przez Hadley (under tests):

Czasami można mieć wątpliwości, gdzie przechodzą testy po uruchomieniu interaktywnie z DevTools :: test(), ale nie kiedy w ryzach R CMD. Zwykle oznacza to, że wprowadzono błędne założenie dotyczące środowiska testowego i często trudno jest to zrozumieć.

To nie wróży dobrze, ale co mogę zrobić? Jakieś pomysły?

Oto błąd pojawia się (test_file to nazwa pliku zawierającego powyższy kod):

checking tests ... 
** running tests for arch 'i386' ... ERROR 
Running the tests in 'tests/testthat.R' failed. 
Last 13 lines of output: 
    3: asNamespace(ns) 
    4: getNamespace(ns) 
    5: tryCatch(loadNamespace(name), error = function(e) stop(e)) 
    6: tryCatchList(expr, classes, parentenv, handlers) 
    7: tryCatchOne(expr, names, parentenv, handlers[[1L]]) 
    8: value[[3L]](cond) 
... 13 lines ... 
    5: tryCatch(loadNamespace(name), error = function(e) stop(e)) 
    6: tryCatchList(expr, classes, parentenv, handlers) 
    7: tryCatchOne(expr, names, parentenv, handlers[[1L]]) 
    8: value[[3L]](cond) 

    testthat results ================================================================ 
    OK: 0 SKIPPED: 0 FAILED: 1 
    1. Error: First column equal (@test_file.R#12) 
+0

Próba jakiegokolwiek debugowania uproszczonego 'my_fun()' (ale wciąż nieudanego testu) byłaby przydatna. –

+0

@ m-dz Rozumiem, że ta funkcja jest dość skomplikowana, a cały pakiet (mniej lub bardziej) składa się z bloków. Wiem, że to długa sprawa, żeby bez pytania zadać to pytanie, ale mam nadzieję, że ktoś wcześniej doświadczył czegoś podobnego. – hejseb

+0

Może spróbuj (po https://github.com/hadley/testthat/issues/86): "Po prostu dodaj' Sys.setenv ("R_TESTS" = "") 'jako pierwszą linię w' tests/testthat.R' ". –

Odpowiedz

3

Odpowiedź jest równie żenujące jak to jest proste. Pakiet musi być załadowany w pliku testowego, tak że powinien zacząć od:

library(mypackage) 
context("Test output") 

Choć myślałem, że pracował wcześniej, to faktycznie nie. Teraz, gdy paczka jest ładowana prawidłowo, widzę, że np. pasek postępu wydrukowany przez my_fun pojawia się w panelu Kompilacja.