2015-12-01 8 views
0

Я использую некоторые тесты с использованием Mocha и chai. Один из тестов висит на вызове .should.be.deep.equal.Mocha/Chai тесты висят на .should.be.deep.equal несмотря на существующий результат

Вот код теста:

// Make the fake connection before running tests 
before(function(done) { 
    mongoose.connect('mongodb://fake.test/TestingDB', function(err) { 
     done(err); 
    }); 
}); 

// Test Cases 
describe('Testing the functions that deal with users and locations:', function() { 
    // Test Setup 
    var req = {}; 
    beforeEach(function(done) { 
     mockgoose.reset() 
     async.parallel([function(callback){ 
      sensors.create(testData.deviceData, function(err, model) { 
        if (err) {console.log(err)} 
        callback(); 
       }); 
     }, function(callback) { 
      locations.create(testData.locationData, function(err, model) { 
        if (err) {console.log(err)} 
        callback(); 
       }); 
      }], function(err) { 
       done(); 
      }); 
    }); 

    afterEach(function(done) { 
     mockgoose.reset(); 
     done(); 
    }); 
    // Tests 
    describe('function locationList', function() { 
     it('should list the test location', function(done) { 
      dbFunctions.locationList(req, function(result) { 
       console.log(result) //Prints the whole result 
       console.log(testData.locationList) 
       result.should.exist; //This doesn't cause it to hang 
       result.should.be.deep.equal(testData.locationList) //hangs here 
       done(result); 
      }); 
     }) 
    }) 
}); 

А вот функция это тестирование:

exports.locationList = function(req, callback) { 
listLocations().then(
    function(data) { 
     callback(data); 
    }, 
    function(err) { 
     console.log('Error Retrieving Location Information: ' + err); 
     callback(err); 
    }); 
}; 

Как я отмечаю в комментариях, объект результатов существует и печатается на консоль. results.should.exist; не генерирует исключение, и если я прокомментирую все, но это испытание отлично работает. По какой-то странной причине, несмотря на то, что существующий объект testData.locationList и result, тест истекает. У меня есть 14 других тестов, которые без каких-либо проблем используют тот же синтаксис. Кто-нибудь знает, что может привести к тому, что это произойдет для этого конкретного теста?

Вот выход из тестов:

Testing the functions that deal with users and locations: 
    function locationList        
     [ { devices: {}, 
      address: '123 Fake St, Waterloo, On', 
      location: 'Unittest', 
      owner: '[email protected]', 
      _id: '-1' } ]   
     [ { devices: {}, 
      address: '123 Fake St, Waterloo, On', 
      location: 'Unittest', 
      owner: '[email protected]', 
      _id: '-1' } ]   

      1) should list the test location 
0 passing (2s) 
1 failing 
1) Testing the functions that deal with users and locations: function locationList should list the test location: 
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test. 
    at null.<anonymous> (C:\Users\My Name\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:189:19) 

Расширение тайм-аут не работает. Также не положить что-то случайное (то есть целое число 1 в функции .should.be.deep.equal()

+0

Я не думаю, что это исправление для вашей проблемы, но вы, вероятно, должны просто вызвать done() вместо done (result), поскольку все, что передано done(), будет интерпретироваться как ошибка. –

ответ

2

Я предполагаю, что обратный вызов в exports.locationList называется синхронно и что ваш тестовый пример на самом деле терпит неудачу, бросая исключение, которое никогда не попадается, потому что обратный вызов (синхронно), вызванный из обработчика обещаний (подробнее here).

Попробуйте и посмотреть, если это работает лучше:

dbFunctions.locationList(req, function(result) { 
    setImmediate(function() { 
    console.log(result) //Prints the whole result 
    console.log(testData.locationList) 
    result.should.exist; //This doesn't cause it to hang 
    result.should.be.deep.equal(testData.locationList) //hangs here 
    done(result); 
    }); 
}); 
// or use a module like dezalgo (https://github.com/npm/dezalgo) 

Основной причиной может быть mockgoose.

Кроме того, вы не используете соответствующие соглашения Node.js, где первый аргумент функции обратного вызова «зарезервирован» для ошибок. Другими словами, ваш код должен выглядеть примерно так:

if (err) { 
    callback(err); 
} else { 
    callback(null, data); 
} 

Вы сейчас проходит как ошибки и данных в качестве первого аргумента.

+0

Я отмечаю ваш ответ как принятый, хотя это не совсем то, что я сделал, чтобы исправить эту проблему. Ваше предложение вызвало появление молчаливой ошибки, но по какой-то странной причине (mockgoose related?), Это привело к тому, что все мои другие тесты начали сбой с «MongoError: топология была уничтожена». Затем я решил, что не буду использовать обещания, поэтому отредактировал мой код, чтобы прекратить их использовать. Это оставило все мои тесты все еще неудачными. Из diff я увидел, что по какой-то странной причине была возвращена вся запись mongo, а не только _doc. Я переписал функцию, чтобы распаковать их и вставить их в список, и все сработало! –

+1

@ ZacharyJacobi мой опыт заключается в том, что смешивание обещаний и обратных вызовов иногда сложно, поэтому лучше всего выполнить одно решение (для вашего собственного кода, сторонний код, который использует обратные вызовы, обычно можно преобразовать в обещания, используя что-то вроде bluebird's ['promisifyAll '] (HTTP: // bluebirdjs.ком/документы/апи/promise.promisifyall.html)). Mocha может обрабатывать обещания изначально, что очень приятно. – robertklep

+0

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

1

Предположения:.. Может быть, этот вопрос лежит мангуста украшающей result с его собственной функции/членов, и один из них как-то застрять в бесконечном цикле когда chai пытается перечислить их всех, чтобы выполнить глубокое сравнение.

Смежные вопросы