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.