2016-05-04 5 views
-1

У меня есть сценарий рабочего узла, и теперь я пытаюсь изучить mocha/chai, чтобы добавить некоторые модульные тесты.mocha/chai return undefined

//Module Code 
var path = require('path'); 
var recursive = require('recursive-readdir'); 


function findData(folderPath) { 
    recursive(folderPath, function (err, files) { 
    return files; 
    }); 
}; 

module.exports.findData = findData; 

Мой мокко код теста:

var expect = require('chai').expect; 

describe('checkData', function() { 
    var findData = require('../custom_modules/findData').findData; 
    var path; 

    before (function() { 
    path = '/Data' 
    }); 

    it('should have 53 files in array', function() { 
    expect(findData(path)).to.have.lengthOf(53); 
    }) 

}); 

Тем не менее, всегда терпит неудачу, потому что возвращение кажется неопределенным. Поэтому я удалил код модуля, чтобы проверить return true, и это сработало.

Так должен ли асинхронный характер рекурсивного модуля, так что я потом пытался добавить обратные вызовы к моему модулю коду:

var path = require('path'); 
var recursive = require('recursive-readdir'); 


function findData(folderPath, cb) { 
    recursive(folderPath, function (err, files) { 
    cb(null, files); 
    }); 
}; 

module.exports.findData = findData; 

Но это не сработало.

Странно, если я запустил node index.js Я получаю список файлов.

Может ли кто-нибудь объяснить мне, как этот код может нормально работать, но когда я пытаюсь использовать mocha/chai для тестирования, я получаю undefined?

Благодаря

Редакции:

Так на основе того, что @Louis сказал в комментариях, я добавил обратный вызов функции.

describe('checkData', function() { 
    var findData = require('../custom_modules/findData').findData; 
    var path; 
    var files; 

    before (function() { 
    path = '/Users/tjmartin/Documents/OSData/OpenNames/Data' 
    }); 

    it('should have 53 files in array', function() { 
    expect(findData(path, function(results) { 
     files = results; 
     })).to.have.lengthOf(53); 
    }) 
}); 

Но это все еще возвращает неопределенный.

+0

Вы показали свою оригинальную реализацию, исходный код тестирования и новую реализацию, но также должны показать новый тестовый код, который вы используете сейчас. В идеале, ваш вопрос должен содержать [mcve]. – Louis

+0

@Louis не уверен, что я понимаю ваш комментарий. Я сказал, что я попытался изменить код модуля для использования обратных вызовов, но это не сработало. Я не изменил свой тестовый код. – tjmgis

+0

Ну, тогда почему это должно работать * вообще *, если вы не изменили свой тестовый код? В вашем тестовом коде вы вызываете 'findData (путь)' без передачи обратного вызова, но ваш новый 'findData' требует обратного вызова. – Louis

ответ

1

Прежде всего, я бы зарегистрировал результат ошибки в вашей реализации findData. Даже если только во время разработки, поэтому вы можете легко увидеть, сообщаются ли какие-либо ошибки (возможно, вы уже это делаете, просто хотели бы упомянуть об этом).

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

Далее я не буду жестко кодировать путь, как у вас в функции before. Вместо этого используйте локальный путь, чтобы тест можно было запустить как часть вашего CI (если он у вас есть), или даже чтобы вы могли захватить его на другой машине и заставить его работать там.

before(function() { 
    path = './tests/TestData'; 
}); 

В вашем пересмотренном примере, хотя вы используете обратный вызов, вы все еще проверяете результат возврата. Вам нужно изменить свой тест, чтобы использовать результат обратного вызова.

it('should have 53 files in array', function(done) { 
    findData(path, function(results) { 
     expect(results).to.have.lengthOf(53); 
     done(); 
    }); 
}); 
+0

большое спасибо. Это работает блестяще. Я искал обратные вызовы для моего chai-кода, а не для мокко. – tjmgis