Nici o imagine de data asta
Imaginați -vă că aveți o funcție care face ceva complicat, iar în mijlocul definiției sale generează o variabilă. Să presupunem acum că doriți să salvați această variabilă și apoi să o reutilizați pentru teste, ceea ce vreau să spun este că doriți ca funcția dvs. să reproducă întotdeauna această variabilă intermediară, indiferent de ceea ce îi oferiți ca intrări. Acest lucru poate fi util pentru testare, dacă calcularea acestei variabile intermediare este costisitoare.
În mine {rix}
Pachet, The rix()
Funcția generează expresii NIX valide de la intrarea R și aceste expresii NIX pot fi apoi utilizate pentru a construi medii de dezvoltare reproductibile care includ pachete R, R, biblioteci de dezvoltare și așa mai departe. Dacă doriți o introducere de 5 minute la {rix}
click aici.
Deci, să presupunem rix()
Se pare că asta:
rix <- function(a,b,c){ ... # lots of code ... # lots of code default.nix_file <- ... # it's generated here # Then a bunch of things happen to it out <- f(default.nix_file) writeLines(out, path) # this is what's written }
Acum ceea ce vreau este să pot „suprascrie” default.nix_file
variabilă pe linia 4 la testare, pentru a oferi dorința pe care o doresc. În acest fel, pot suna rix()
Cu câțiva parametri „ușori” care fac ca calculele până la acel moment să fie foarte rapid. Scopul meu este în esență să testez f()
(linia 6), care pune întrebarea, de ce să nu scrii f()
Ca funcție separată și testați -o? Aceasta ar fi cea mai bună practică, cu toate acestea, nu prea am un astfel de f()
mai degrabă, este o serie de pași complicați care urmează și rescriind totul pentru a -l face ușor testabil ar dura prea mult timp.
În schimb, am optat pentru următoarele:
rix <- function(a,b,c){ ... # lots of code ... # lots of code stub_default.nix <- getOption("TESTTHAT_DEFAULT.NIX", default = NULL) if(!is.null(stub_default.nix)){ default.nix_file <- readLines(stub_default.nix) } else { default.nix_file <- ... # it's generated here if not being tested } out <- f(default.nix_file) # Then a bunch of things happen to it writeLines(out, path) # this is what's written }
Pe linia 5, primesc opțiunea "TESTTHAT_DEFAULT.NIX"
Și dacă nu există, stub_default.nix
va fi setat la NULL
. Deci, dacă este NULL
Este o afacere ca de obicei, dacă nu, atunci asta default.nix
Fișierul dedicat testării este transmis mai jos. Într -un anumit sens, am injectat variabila de care aveam nevoie în locul de care aveam nevoie.
Apoi, testele mele arată astfel:
testthat::test_that("remove_duplicate_entries(), don't remove duplicates if skip", { dups_entries_default.nix <- paste0( testthat::test_path(), "/testdata/default-nix_samples/dups-entries_default.nix") tmpdir <- tempdir() # This copies the file I need in the right path destination_file <- file.path(tempdir(), basename(dups_entries_default.nix)) file.copy(dups_entries_default.nix, destination_file, overwrite = TRUE) on.exit( unlink(tmpdir, recursive = TRUE, force = TRUE), add = TRUE ) removed_dups <- function(destination_file) { # Set the option to the file path and clean the option afterwards op <- options("TESTTHAT_DEFAULT.NIX" = destination_file) on.exit(options(op), add = TRUE, after = FALSE) out <- rix( date = "2025-02-10", project_path = tmpdir, overwrite = TRUE, skip_post_processing = TRUE) # <- this is actually want I wanted to test file.path(destination_file) } testthat::expect_snapshot_file( path = removed_dups(destination_file), name = "skip-dups-entries_default.nix", ) })
Pe linia 22, am setat opțiunea și pe linia 23 scriu cod pentru a elimina această opțiune odată ce testul a fost terminat, pentru a nu încurca testele ulterioare. Acesta este un test instantaneu, așa că acum pot arunca o privire asupra fișierului rezultat și, într-adevăr, mă asigur că post-procesarea a fost omisă, așa cum era de așteptat.
Cum ai fi făcut asta?