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.