Utilizarea Opțiuni () pentru a injecta variabila internă a unei funcții pentru testarea reproductibilă

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

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?

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.