Создание Mocha описать ожидание моего асинхронного вызова и пост-тестов [duplicate]

Этот отличный ответ очень хорошо объясняет, что происходит, и дает решение. Я хотел бы добавить другое решение, которое может быть подходящим в подобных случаях: с помощью метода query :

result = result.query("(var > 0.25) or (var < -0.25)")

См. Также http: // pandas. pydata.org/pandas-docs/stable/indexing.html#indexing-query.

(Некоторые тесты с фреймворком данных, с которыми я сейчас работаю, показывают, что этот метод немного медленнее, чем используя побитовые операторы в рядах булевых: 2 мс против 870 мкс)

Предупреждение: по крайней мере, одна ситуация, когда это не просто, когда имена столбцов являются выражениями python. Я имел столбцы с именами WT_38hph_IP_2, WT_38hph_input_2 и log2(WT_38hph_IP_2/WT_38hph_input_2) и хотел выполнить следующий запрос: "(log2(WT_38hph_IP_2/WT_38hph_input_2) > 1) and (WT_38hph_IP_2 > 20)"

Я получил следующее исключение:

  • KeyError: 'log2'
  • UndefinedVariableError: name 'log2' is not defined
  • ValueError: "log2" is not a supported function

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

Предлагается возможное обходное решение здесь .

9
задан ThomasReggi 3 September 2015 в 03:59
поделиться

4 ответа

Я не уверен, есть ли какой-нибудь простой способ сделать это, но вы можете попробовать запустить Mocha программно .

Вот немного грязная версия того, что это могло

data.js

var Promise = require('bluebird')

module.exports.tests = []

function getTests () {
  return Promise.resolve('kitty pancake')
  .delay(500)
  .then(function (value) {
     module.exports.tests = [
      {
        'arg': 'kitty',
        'expect': value
      },
      {
        'arg': 'doggy',
        'expect': 'doggy pancake'
      }
    ]
  })
}

module.exports.getTests = getTests

test-launcher.js

var Mocha = require('mocha'),
    fs = require('fs'),
    path = require('path')

// First, you need to instantiate a Mocha instance.
var mocha = new Mocha()

// Then, you need to use the method "addFile" on the mocha
// object for each file.

// Here is an example:
fs.readdirSync('test').filter(function(file){
    // Only keep the .js files
    return file.substr(-3) === '.js'

}).forEach(function(file){
    // Use the method "addFile" to add the file to mocha
    mocha.addFile(
        path.join('test', file)
    )
})

// make sure your tests are loaded before running the tests
require('./data').getTests().then(function () {

  // Now, you can run the tests.
  mocha.run(function(failures){
    process.on('exit', function () {
      process.exit(failures)
    })
  })
})

test/index.js

var assert = require('assert')

var tests = require('../data').tests

var fn = function (value) {
  return value + ' ' + 'pancake'
}

describe('test', function () {
  describe('example', function () {
    tests.forEach(function (test) {
      it('should return ' + test.expect, function (){
        var value = fn(test.arg)
        assert.equal(value, test.expect)
      })
    })
  })
})

Затем вы можете запустить ваши остатки, запустив test-launcher.js.

1
ответ дан Daniel Perez 24 August 2018 в 06:05
поделиться
1
ответ дан Perseids 24 August 2018 в 06:05
поделиться

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

var assert = require('assert')
var Promise = require('bluebird')

/* global describe, it*/

var fn = function(value) {
  return value + ' ' + 'pancake'
}

function getTests() {
  return Promise.resolve('kitty pancake')
    .delay(500)
    .then(function(value) {
      return [
        {
          'arg': 'kitty',
          'expect': value
        },
        {
          'arg': 'doggy',
          'expect': 'doggy pancake'
        }
      ]
    })
}

describe('example', function() {
  it('should handle many things', function(done) {
    getTests().then(function(tests) {
      tests.forEach(function(test) {
        var value = fn(test.arg)
        assert.equal(value, test.expect, 'should return ' + test.expect)
      })
      done()
    })
  })
})
-1
ответ дан Peter Lyons 24 August 2018 в 06:05
поделиться

Я бы использовал async / await с опцией delay , как показано ниже:

setTimeout(async () => {
//get tests async
const tests = await getTests()

describe('example', async () => {

  tests.forEach((test) => {
   it(`test name: ${test.name} `, () => {
    console.log(test.name)
  })
 })
})

run()
}, 1000)
0
ответ дан Quang Xuan Nguyen 24 August 2018 в 06:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: