2013-08-14 10 views
7

Mi sto imbattendo in quella che penso sia una condizione di competizione tra i file di salvataggio di Vim e Karma che sta eseguendo nuovamente i miei test di unità Jasmine. Ecco una sequenza di corse quattro prove che dimostra il sintomo (ho troncato i lunghissimi percorsi nel log degli errori):Come faccio a mettere in pausa la funzione di auto-controllo di Karma prima di eseguire i test?

$ karma start karma.conf.js --auto-watch 
[... snip a lot of coding and test running ...] 
PhantomJS 1.6 (Linux) LOG: 'Running tests at 2013-08-14T08:19:57.252Z' 
PhantomJS 1.6 (Linux): Executed 4 of 4 SUCCESS (0.307 secs/0.013 secs) 
PhantomJS 1.6 (Linux) LOG: 'Running tests at 2013-08-14T08:20:09.866Z' 
PhantomJS 1.6 (Linux): Executed 4 of 4 SUCCESS (0.288 secs/0.012 secs) 
PhantomJS 1.6 (Linux) LOG: 'Running tests at 2013-08-14T08:20:14.366Z' 
PhantomJS 1.6 (Linux) controller should have a breadcrumb after $routeChangeSuccess FAILED 
     Error: No module: myapp.question 
      at /home/rmunn/.../angular.js:1124 
      at ensure (/home/rmunn/.../angular.js:1065) 
      at module (/home/rmunn/.../angular.js:1296) 
      at /home/rmunn/.../angular.js:2806 
     TypeError: 'undefined' is not an object (evaluating 'rootScope.$broadcast') 
      at /home/rmunn/.../unit/controllersSpec.js:35 
PhantomJS 1.6 (Linux): Executed 4 of 4 (1 FAILED) (0.312 secs/0.014 secs) 
PhantomJS 1.6 (Linux) LOG: 'Running tests at 2013-08-14T08:20:28.588Z' 
PhantomJS 1.6 (Linux): Executed 4 of 4 SUCCESS (0.287 secs/0.013 secs) 

L'unico cambiamento che ho fatto per far scattare queste quattro corse è stata aggiunta e la rimozione spazi bianchi dal file question.js ; non ci sono state sostanziali modifiche al codice, ma il # 3 non è riuscito dove sono state eseguite le operazioni 1, 2 e 4.

La configurazione di My Vim è configurata per conservare i file di backup e, per impostazione predefinita, Vim conserva i file di backup rinominando il file originale e scrivendone uno nuovo. (Tranne in determinate condizioni, che non si applicano qui). Quello che penso stia accadendo è che sto innescando una condizione di gara: Vim rinomina question.js (o qualsiasi altro file che ho appena modificato), Karma rileva quel cambiamento e inizia a eseguire i test, e poiché ho così pochi test in questo momento, i test tutti eseguire prima che lo scheduler dei processi di Linux riceva il controllo su Vim. Una volta che Vim viene programmato di nuovo, scrive il nuovo contenuto di question.js, ma a quel punto è troppo tardi per il test Jasmine che dipende da question.js esistente e non vuoto.

Potrei risolvere il problema configurando Vim per non conservare i file di backup, ma preferirei non correre questo rischio. C'è un motivo per cui utilizzo i file di backup, dopo tutto. Quindi c'è un modo per dire a Karma "quando rilevi un cambio di file, pausa per N millisecondi, quindi esegui i test unitari"? Mentre sarebbe una soluzione a forza bruta, è risolvere questa particolare condizione di gara. O se qualcuno ha altre idee intelligenti da offrire, mi piacerebbe sentire anche quelle.

+0

Would impostazione ' 'backupdir'' ad un altro, specifiche, aiuto directory? – romainl

+0

Ho già impostato '' backupdir'' su ~/.vim/.backup (o meglio, [Vim Config of Champions] di Jeremy Mack (https://github.com/mutewinter/dot_vim) ha impostato ''backupdir'' per me). Il problema è che Karma si sta attivando sul file originale "scomparendo" quando si sposta nella directory di backup, e quindi i test a volte vengono eseguiti prima che Vim riesca a ricreare il file. – rmunn

+0

OK. Probabilmente è fuori discussione ma non è una buona idea usare la configurazione di qualcun altro. – romainl

risposta

3

This GitHub issue discute questo problema pure. Vim può essere configurato per eseguire backup copiando e quindi sovrascrivendo l'originale, invece di spostare l'originale e scrivere un nuovo file. Anche se questo non è tecnicamente una risposta alla tua domanda, dovrebbe essere sufficiente per risolvere il problema:

set backupcopy=yes 

Vim ora modificare il file al suo posto, e il Karma rileverà questo come "cambiato" invece di "rimosso ".

Vedi :help 'backupcopy' per i dettagli:

     *'backupcopy'* *'bkc'* 
'backupcopy' 'bkc' string (Vi default for Unix: "yes", otherwise: "auto") 
      global 
      {not in Vi} 
    When writing a file and a backup is made, this option tells how it's 
    done. This is a comma separated list of words. 

    The main values are: 
    "yes" make a copy of the file and overwrite the original one 
    "no" rename the file and write a new one 
    "auto" one of the previous, what works best 
+0

Ho avuto lo stesso problema e questa impostazione ha risolto il problema. thks! – cesarpachon

1

Da karma documentation, sembra che ci sia un'opzione "escludi" per rimuovere alcuni pattern di file. Se modifichi l'opzione per avere un nome diverso per il backup e ignori il formato di backup di Vim, dovrebbe funzionare correttamente.

Ma in qualche modo cambierà il tuo flusso di lavoro, probabilmente dovrai ignorare il backup nel tuo .gitignore.

Solo un commento a parte, mi sento come con vim persistente annullare (versione> 7.3), sembra che il file di backup è un po 'ridondante. Quindi forse usare,

set nobackup 

set undodir=~/.vim/undodir 
if (v:version >= 703) 
    set undofile 
    set undolevels=1000 "maximum number of changes that can be undone 
    set undoreload=10000 "maximum number lines to save for undo on a buffer reload 
endif 
+0

So già che il karma non si attiva sul file di backup, perché i backup stanno entrando nella mia directory ~/.vim/.backup, che non si trova nel percorso di ricerca del karma. (Se sembra un'impostazione familiare, allora sì, hai ragione: sto usando [Vim Config of Champions] di Jeremy Mack (https://github.com/mutewinter/dot_vim) come base per la mia configurazione personale). Sembra che il karma si stia innescando sul file originale che si sta eliminando, non sul file di backup che si sta creando. Quindi, sfortunatamente, non penso che il tuo suggerimento funzionerà. Grazie comunque. – rmunn

+0

@ rmunn: tienici informati se trovi una soluzione o una soluzione alternativa. Sembra essere un problema che potrebbe essere attivato da vari strumenti. –

+0

Ancora non trovato, e ci vorranno alcuni giorni prima che torni a questo problema. Abbiamo presto una scadenza per la pubblicazione delle pietre miliari e sto lavorando ad altre parti del codice per prepararlo prima della scadenza. I bugfix sono al momento una priorità leggermente più alta rispetto a "i miei strumenti di test non si comportano in modo ottimale". Ma una volta tornato a questo problema, mi assicurerò di aggiornare questa domanda se trovo qualcosa che funzioni bene. – rmunn

Problemi correlati