Scrivere una gemma che supporta linguaggi compilati con Rake. Come testare?

2

Voglio creare un gioiello che estenda la funzionalità di Rake, creando comandi per la compilazione del codice .NET. *

Fondamentalmente, voglio essere in grado di scrivere un Rakefile in questo modo:

desc "Build main executable"
fsc :build do |t|
  t.output_file = "nde.exe"
  t.output_folder = "output"
  t.source_files << "main.fs"
  t.packages << "packages/Nancy"
end

task :default => [:clean, :build]

Quindi, proprio come la funzione file in rake crea un FileTask, la funzione fsc dovrebbe creare un'attività di compilazione.

Ho creato un POC in cui ho il codice inline nel Rakefile - e mi dà un'idea su come farlo. Il prossimo passo è isolarlo in una gemma.

Il punto centrale nel mio POC è la seguente funzione:

def create_compilation_task
  task_dependencies = source_files | assembly_refs 
  dest = File.join output_folder, output_file
  Rake::FileTask::define_task dest => task_dependencies do |t|
    refs = assembly_refs.map { |r| "-r:#{r}" }.join(" ")
    output = "--out:#{dest}"
    target = "--target:exe"
    sources = source_files.join(" ")
    system "fsharpc #{output} #{refs} #{target} #{sources}"
  end
end

Ma come faccio a scrivere test per un simile gioiello?

Ho creato questo codice di prova scheletro:

describe 'F# compiler' do
  it 'compiles code' do
    @app = Rake::Application.new
    Rake.application = @app
    Rake::Task::define_task :build do
    end
    @app[:build].invoke()
  end
end

Questo in effetti chiama l'attività definita nel contesto del test. Ci sono problemi a scrivere il codice di test in questo modo?

Indipendenza dal file system

Il dominio del problema è quello dei file sul disco e internamente ho usato FileTask oggetti per rappresentare sia i file di input che di output, poiché posso sfruttare la funzionalità di ottimizzazione della build di Rake.

Ma come faccio a testarlo, ad es. verificando che l'output non sia effettivamente generato quando è più nuovo di tutti gli input. Potrei verificare la catena di Task di istanze in fase di creazione, ma testerebbe un dettaglio di implementazione. Preferirei molto eseguire l'attività e verificare il comportamento.

C'è un modo per avviare l'infrastruttura Rake con un file system fittizio, o posso creare una cartella temporanea su disco durante un test?

Verifica dei comandi di sistema chiamati

Uso la funzione system per chiamare un programma esterno. Mi piacerebbe molto evitare di chiamare il compilatore F # durante i test, quindi invece devo catturare la chiamata system call.

Anche la verifica della chiamata non dovrebbe essere troppo specifica, cioè non dovrebbe determinare se il comando è uguale a qualche stringa attesa. Quando verifica che il compilatore sia stato chiamato con i file sorgente corretti, quel test non deve fallire se le opzioni di ottimizzazione del compilatore sono state modificate.

Immagino che si possa usare un parser di argomento CLI standard.

* Sono a conoscenza della gemma Albacore, ma che compila i progetti msbuild, dove voglio compilare direttamente i file del codice sorgente.

    
posta Pete 12.01.2015 - 11:28
fonte

0 risposte

Leggi altre domande sui tag