Как мне создать тест мокко, который ждет, пока процесс завершится первым? - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь написать тест для моего генератора Yeoman, который вызывает утилиту командной строки для генерации некоторых файлов в папке, которую я создаю. Я видел различные примеры того, как установить тайм-аут для ожидания завершения функции, но изо всех сил пытаюсь заставить его работать локально.

Вот мой тест:

 describe('Should properly scaffold with config for Spring and wsdl2rest', function () {

    before(function () {
      basicProps.name = 'MyAppMock';
      basicProps.package = 'com.generator.mock';
      basicProps.camelVersion = '2.18.2';
      basicProps.camelDSL = 'spring';
      var wsdlPath = path.join(__dirname, '../test/address.wsdl');
      basicProps.wsdl = wsdlPath;
      basicProps.outdirectory = 'src/main/java';

      return helpers.run(path.join(__dirname, '../app'))
        .inTmpDir(function (dir) {
          var done = this.async(); // `this` is the RunContext object.
          fs.copy(path.join(__dirname, '../templates'), dir, done);
          basicProps.outdirectory = path.join(dir, 'src/main/java');
        })
        .withOptions({ wsdl2rest: true })
        .withPrompts({ name: basicProps.name })
        .withPrompts({ camelVersion: basicProps.camelVersion })
        .withPrompts({ camelDSL: basicProps.camelDSL })
        .withPrompts({ package: basicProps.package })
        .withPrompts({ wsdl: basicProps.wsdl })
        .withPrompts({ outdirectory: basicProps.outdirectory })
        .toPromise();
    });

    it('Should create the basic structure two ways', function () {
      assert.file('pom.xml');
      assert.file('README.md');
      assert.file('src/main/resources/META-INF/spring/camel-context.xml');
      assert.file('src/main/resources/META-INF/spring/camel-context-rest.xml')
    });
  });

Проблема в том, что исполняемый файл командной строки заканчивает ПОСЛЕ теста, чтобы увидеть, есть ли там файлы, которые он генерирует, поэтому я получаю:

Creating wsdl2rest java output directory
calling: java -jar C:\Users\brianf\Documents\GitHub\generator-camel-project-fork\app\wsdl2rest\target\wsdl2rest-impl-fatjar-0.1.3-SNAPSHOT.jar --wsdl file:///C:/Users/brianf/Documents/GitHub/generator-camel-project-fork/test/address.wsdl --out C:\Users\brianf\AppData\Local\Temp\8d84f15024327cbe792407e1294ab46a5b4a1080\src\main\java --camel-context C:\Users\brianf\AppData\Local\Temp\8d84f15024327cbe792407e1294ab46a5b4a1080\src\main\resources\META-INF\spring\camel-context-rest.xml
      1) Should create the basic structure two ways


  11 passing (411ms)
  1 failing

  1) generator-camel:wsdl2rest
       Should properly scaffold with config for Spring and wsdl2rest
         Should create the basic structure two ways:

      AssertionError [ERR_ASSERTION]: src/main/resources/META-INF/spring/camel-context-rest.xml, no such file or directory
      + expected - actual

      -false
      +true

      at convertArgs.forEach.file (node_modules\yeoman-assert\index.js:56:12)
      at Array.forEach (<anonymous>)
      at Function.assert.file (node_modules\yeoman-assert\index.js:54:26)
      at Context.<anonymous> (test\app.js:206:14)



stdout: Retrieving document at 'file:/C:/Users/brianf/Documents/GitHub/generator-camel-project-fork/test/address.wsdl'.

stderr: log4j:WARN No appenders could be found for logger (org.jboss.fuse.wsdl2rest.impl.WSDLProcessorImpl).

stderr: log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

wsdl2rest generated artifacts successfully

В чем секрет того, чтобы заставить эту штуку ждать? Я уверен, что упускаю что-то очевидное, но я в основном программист на Java, а не JavaScript, и немного борюсь с некоторыми асинхронными аспектами языка.

Заранее спасибо!

Обновление: хотя было предложено использовать параметры асинхронного кода Mocha (https://mochajs.org/#asynchronous-code) Мне трудно внедрить эти концепции в тест, который я написал, и я мог бы использовать некоторую дополнительную помощь, если кто-то справился с этим с тестированием Йоменского генератора?

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Глядя на документы мокко здесь - https://mochajs.org/#asynchronous-hooks

Кажется, что вам может понадобиться поместить "перед" за пределы вашего "описания". В качестве альтернативы вы можете заключить "это" в другое "описание".

0 голосов
/ 16 ноября 2018

Благодаря @Evan, мы нашли решение вчера ...

Есть две части - одна из них заключалась в том, что метод, который мы создали для фактического вызова нашего Java jar, не возвращал Promise ... поэтому мы изменили его на:

   console.log('calling: ' + cmdString);
return new Promise((resolve, reject) => {
    const wsdl2rest = exec(cmdString);
    wsdl2rest.stdout.on('data', function (data) {
        console.log(`stdout: ${data}`);
    });
    wsdl2rest.stderr.on('data', function (data) {
        console.log(`stderr: ${data}`);
    });
    wsdl2rest.on('close', function (code) {
        if (code === 0) {
            console.log(`wsdl2rest generated artifacts successfully`);
            resolve()
        } else {
            reject()
            console.log(`stderr: ${code}`);
            console.log(`wsdl2rest did not generate artifacts successfully - please check the log file for details`);
        }
    });    
})

И мы изменили тест на:

describe('generator-camel:wsdl2rest', function () {
  describe('Should properly scaffold with config for Spring and wsdl2rest', function () {
    it('Should create the basic structure two ways', function () {
      basicProps.name = 'MyAppMock';
      basicProps.package = 'com.generator.mock';
      basicProps.camelVersion = '2.18.2';
      basicProps.camelDSL = 'spring';
      var wsdlPath = path.join(__dirname, '../test/address.wsdl');
      basicProps.wsdl = wsdlPath;
      basicProps.outdirectory = 'src/main/java';
      return helpers.run(path.join(__dirname, '../app'))
        .inTmpDir(function (dir) {
          var done = this.async(); // `this` is the RunContext object.
          fs.copy(path.join(__dirname, '../templates'), dir, done);
          basicProps.outdirectory = path.join(dir, 'src/main/java');
        })
        .withOptions({ wsdl2rest: true })
        .withPrompts({ name: basicProps.name })
        .withPrompts({ camelVersion: basicProps.camelVersion })
        .withPrompts({ camelDSL: basicProps.camelDSL })
        .withPrompts({ package: basicProps.package })
        .withPrompts({ wsdl: basicProps.wsdl })
        .withPrompts({ outdirectory: basicProps.outdirectory })
        .toPromise() 
        .then(() => { 
          assert.file('pom.xml'); 
          assert.file('README.md'); 
          assert.file('src/main/resources/META-INF/spring/camel-context.xml'); 
          assert.file('src/main/resources/META-INF/spring/camel-context-rest.xml')
        });
    });
});

Имея все это в наличии, мы можем запустить toPromise, и он ожидает выполнения утверждений.

Спасибо за руководство, Эван!

0 голосов
/ 07 ноября 2018

@ tbking предложил правильный подход. Это прекрасно работает - спасибо за полезные советы!

it('Should create the basic structure two ways', function () {
  basicProps.name = 'MyAppMock';
  basicProps.package = 'com.generator.mock';
  basicProps.camelVersion = '2.18.2';
  basicProps.camelDSL = 'spring';
  var wsdlPath = path.join(__dirname, '../test/address.wsdl');
  basicProps.wsdl = wsdlPath;
  basicProps.outdirectory = 'src/main/java';

  return helpers.run(path.join(__dirname, '../app'))
    .inTmpDir(function (dir) {
      var done = this.async(); // `this` is the RunContext object.
      fs.copy(path.join(__dirname, '../templates'), dir, done);
      basicProps.outdirectory = path.join(dir, 'src/main/java');
    })
    .withOptions({ wsdl2rest: true })
    .withPrompts({ name: basicProps.name })
    .withPrompts({ camelVersion: basicProps.camelVersion })
    .withPrompts({ camelDSL: basicProps.camelDSL })
    .withPrompts({ package: basicProps.package })
    .withPrompts({ wsdl: basicProps.wsdl })
    .withPrompts({ outdirectory: basicProps.outdirectory })
    .toPromise().then(function(value) {
      it('Should create the basic structure two ways', function () {
        console.log('testing...');
        assert.file('pom.xml');
        assert.file('README.md');
        assert.file('src/main/resources/META-INF/spring/camel-context.xml');
        assert.file('src/main/resources/META-INF/spring/camel-context-rest.xml')
      });
    });
});
...