2017-12-11 106 views
11

Powiedzmy masz prosty test mokka:Czy istnieje sposób, aby uzyskać bieżącą instancję Mocha i edytować opcje w czasie wykonywania?

describe("Suite", function(){ 
    it("test",function(doneCallback){ 
     // here be tests 
    }); 
}); 

W tym teście mogę zmienić czas dodając this.timeout(VALUE); gdziekolwiek wewnątrz funkcji describe.

Jednak oprócz wartości timeout, istnieje wiele innych, które mogą być Mocha options deklarowanej albo wyłącznie z wiersza polecenia lub z pliku mocha.opts że mieszka w folderze testowym (./test/mocha.opts).

Potrzebuję zmienić niektóre z tych opcji w czasie wykonywania (na przykład reporter), a nie w wierszu polecenia/mocha.opts pliku.

Z moich badań wynika, że ​​istnieje an article explaining how you can use mocha programmatically, co pozwoliłoby na zmianę tych opcji w czasie wykonywania, ale musisz sam utworzyć instancję Mocha, podczas gdy w zwykłym teście nie ma bezpośredniego dostęp do instancji Mocha.

Czy istnieje sposób, aby uzyskać instancję Mocha z istniejącego testu i zmienić niektóre z tych opcji, takich jak reporter w czasie wykonywania podczas testu?

chciałbym mieć opcję, która nie wymaga modyfikowania kodu źródłowego Mocha w jakikolwiek sposób (przypuszczam, że mogę manipulować instancji Mocha wdrożyć sposób uzyskać instancji bezpośrednio w konstruktorze Mocha) .

+0

Wygląda na to, że chcesz śledzić ten artykuł, w którym sam tworzysz instancję mocha. – kevzettler

+0

@kevzettler Jaki artykuł? Ten, z którym się łączyłem? Ten wymaga od ciebie samodzielnego utworzenia instancji 'Mocha' i runnera' Mocha' (dodaj pliki testowe itp.), Podczas gdy ja chcę użyć z wiersza poleceń 'mocha myTest.js' i przystawię' myTest.js' do 'Mocha 'instancja i móc modyfikować opcje w runtime – Adelin

+0

tak, https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically artykuł. – kevzettler

Odpowiedz

2

Nie, nie możesz. bez zmiany kodu.

W skrócie, mocha jest tworzona w zakresie, do którego nie można uzyskać dostępu z testów.Bez wchodzenia w szczegóły, obiekty znajdujące się w twoim zasięgu nie mogą zmienić żądanych opcji. (Nie można tego zrobić: link)

Ale istnieje sposób, aby zdefiniować własne reporter i dostosować wyjście dla każdego testu:

Utwórz plik o nazwie MyCustomReporter.js:

'use strict'; 

module.exports = MyCustomReporter; 

function MyCustomReporter (runner) { 

    runner.on('start', function() { 
     var reporter = this.suite.suites["0"].reporter; 
     process.stdout.write('\n'); 

    }); 

    runner.on('pending', function() { 
      process.stdout.write('\n '); 
    }); 

    runner.on('pass', function (test) { 
     var reporter = this.suite.useReporter; 
     if(reporter == 'do this') { 
     } 
     else if(reporter == 'do that'){ 
     } 
     process.stdout.write('\n '); 
     process.stdout.write('passed'); 
    }); 

    runner.on('fail', function() { 
     var reporter = this.suite.useReporter; 
     process.stdout.write('\n '); 
     process.stdout.write('failed '); 
    }); 

    runner.on('end', function() { 
     console.log(); 
    }); 
} 

Po uruchomieniu mokka, przechodzą ścieżkę MyCustomReporter.js jako parametr reportera (bez js), np:

mocha --reporter "/home/user/path/to/MyCustomReporter" 

Domyślna skrypt mokka rzeczywiście próbuje wymaga pliku reportera, jeśli nie znajduje się w tych domyślnych (pod lib/reporterów), github link

Wreszcie w swoich badaniach, można przekazać niektóre parametry, aby dostosować wyjście swojego reportera:

var assert = require('assert'); 
describe('Array', function() { 
    describe('#indexOf()', function() { 
     this.parent.reporter = 'do this'; 
    it('should return -1 when the value is not present', function() { 
     this.runnable().parent.useReporter = 'do this'; 
     assert.equal([1,2,3].indexOf(4), -1); 
    }); 
    }); 
}); 
+0

Przyjąłem odpowiedź, że rzeczywiście nie można pobrać instancji z innego kontekstu i fakt, że [link, do którego się odwołałeś] (https://stackoverflow.com/questions/1789892/access-parent-object -in-javascript) był dla mnie dobrym źródłem, aby lepiej to zrozumieć. Jednak część, w której wyjaśniasz mi, jak utworzyć niestandardowego reportera, była dla mnie trudna. Mam już jeden i chciałem przejść z domyślnego reportera ('list') do niestandardowego reportera, w czasie wykonywania. – Adelin

2

Najlepszym sposobem na osiągnięcie tego jest użycie Mocha zgodnie z odnośnikiem wiki, do którego już się odwołałeś, który programowo używa programu Mocha.

Więc do dochodzenia na zmianę parametru reporter Oto krótki przykład, że zrobi to, co chcesz, aby uruchomić testy przeciwko teoretycznie już istniejącego pliku o nazwie test-file-a.js który zawiera testy:

var Mocha = require('mocha'), 
    mocha = new Mocha(), 
    path = require('path'); 

mocha.addFile(path.join(__dirname, 'test-file-a.js')); 

mocha 
    .reporter('list') 
    .run(); 

Poza tym istnieje wiele innych opcji, które można wykorzystać, a także istnieją pewne słuchaczy na imprezy, jak test że może chcesz coś zrobić podczas testu, na przykład:

mocha 
    .reporter('list') 
    .ui('tdd') 
    .bail() 
    .timeout(10000) 
    .run()  
    .on('test', function(test) { 
     if (test.title === 'some title that you want here') { 
      //do something 
     } 
    }); 

Należy pamiętać, że można zdefiniować opcje dla każdej instancji Mocha, która uruchomi ponownie zestaw testowy, ale nie w czasie wykonywania zestawu testów, więc na przykład, jeśli rozpoczniesz testy dla test-file-a.js z opcją reporter('list') jak powyżej nie można go zmienić, gdy testy są uruchomione na coś innego, jak na przykład w przypadku opcji timeout, gdzie można wykonać this.timeout().

Należy zatem utworzyć instancję nowej instancji Mocha, jak w przykładach powyżej, za każdym razem za pomocą różnych opcji.