pyfakefs
sembra molto utile: "è stato inizialmente sviluppato come una modesta implementazione falsa dei moduli core Python per supportare interazioni di file system moderatamente complesse ed è stato introdotto su Google. nel settembre 2006. Da allora, ha ricevuto molti (ben collaudati) contributi per estenderne funzionalità e utilità, ed è utilizzato in oltre 900 test di Google Python. "Come sostituire i riferimenti di accesso ai file per un modulo sotto test
Al momento la documentazione è disponibile solo all'interno di docgings dello source code stesso. Spiega che il modulo fornisce i seguenti elementi:
- FakeFile: fornisce l'aspetto di un file reale.
- FakeDirectory: fornisce l'aspetto di una directory reale.
- FakeFilesystem: fornisce l'aspetto di una gerarchia di directory reale.
- FakeOsModule: utilizza FakeFilesystem per fornire una sostituzione del modulo os falso.
- FakePathModule: sostituzione modulo os.path faked.
- FakeFileOpen: Faked file() e open() sostituzioni di funzione.
Tuttavia, la documentazione non spiega come utilizzare efficacemente questi elementi nei test.
Qual è il modo corretto per garantire che un modulo sottoposto a test acceda a un file system falso e non a quello reale?
Penso che quelle API che hai scoperto nelle docstring siano in pratica ciò che devi chiamare durante i test. Quindi lo metti in un metodo di test individuale, o setup, o setupClass (o tearDown *). Cos'altro ti dà fastidio? – CppLearner
Non sono chiaro su come ottenere il modulo in prova per utilizzare il filesystem che creo usando l'API 'fake_filesystem'. Non penso che abbia senso, per esempio, fornire una funzione 'file()' alle classi o alle funzioni del mio modulo solo per permettere di testare. Preferirei che mi aspettassi di farlo con "benevolo patch-scimmia" in un modo simile a [questa risposta] (http://stackoverflow.com/questions/295438/how-can-one-mock-stub-python-module- like-urllib? rq = 1 # answer-295481), ma non sono sicuro di cosa sia la patch di scimmia. – intuited
Le patch per le scimmie non sono così facili se devi farlo dall'inizio. Puoi controllare la libreria di simulazioni da Python e usarla per eseguire patch su determinate operazioni fornendo l'oggetto che desideri venga restituito dalla classe. Posso dare un pensierino un giorno o due da adesso. Nel frattempo vedrò se gli altri possono darti dei pensieri. Un'alternativa è l'iniezione di dipendenza, ma funziona e ha senso se la funzione o il metodo passa esplicitamente in alcune dipendenze, ad esempio un oggetto simile a un file o un oggetto di sessione del database. – CppLearner