Показать сообщение отдельно
  #821 (permalink)  
Старый 04.02.2015, 23:16
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Gozar Посмотреть сообщение
Запрашивай заголовки, если по заголовкам картинка, качаешь, если "фига" то нет.
хотелось бы вообще убрать HTTP из теста...
Сообщение от Zend Посмотреть сообщение
кстати я не вижу смысла в этом тесте так как там нет done().
там возвращается Promise.

Сообщение от Zend Посмотреть сообщение
по моему должно быть так:
- ждёшь завершения асинхронных штук
- в колбэке проверяешь то что тебе нужно
- вызываешь done()
ещё не плохо время контролировать, за которое тест должен выполниться

не хочешь ждать, уверен что там всё ок - отключи его, добавь "x":
xit('......

кстати чем тестируешь? mocha?
да, mocha. и с ней chai с плагинами


в общем, порешил дело! отрефакторил функцию, вынесев ввод\вывод (HTTP запрос и запись в файл) в отдельные 2 функции:
/** Скачает изображение по ссылке, сохранит в папку */
exports.downloadImage = function (imageURL) {
  var ext = path.extname(imageURL);
  var imageName = utils.getImageName(imageURL);
  var dest = path.join(imageSavePath, imageName);

  /** @type {Object} RESOLVE ARGUMENT */
  var info = {imageURL: imageURL, dest: dest, ext: ext, imageName: imageName};

  return exports.downloadImage.request(imageURL).
    then(function (buffer) {
      return exports.downloadImage.write(dest, buffer);
    }).
    return(info);
};

// Скачает ответ по ссылке и вернёт результат в формате буфера
exports.downloadImage.request = function (url) {
  return request({url: url, encoding: null}).get(1);
};

// Запишет буфер buffer в файл dest
exports.downloadImage.write = function (dest, buffer) {
  return fs.writeFileAsync(dest, buffer);
};

( request - это var request = Promise.promisify(require('request')); )

ну и в тестах сделал подмену на эти две функции (request и write)
describe('downloadImage', function () {

    var original = {};
    var url = 'http://i.imgur.com/emZNv0N.jpg';
    var buffer = new Buffer('Hello');

    var fakeRequest = sinon.stub().withArgs(url).returns(Promise.resolve(buffer));

    var fakeWrite = sinon.stub().returns(Promise.resolve());

    beforeEach(function () {
      original.request = utils.downloadImage.request;
      original.write = utils.downloadImage.write;
      utils.downloadImage.request = fakeRequest;
    });

    afterEach(function () {
      utils.downloadImage.request = original.request;
      utils.downloadImage.write = original.write;
    });

    it('should download image by url', function () {
      return utils.
        downloadImage('http://i.imgur.com/emZNv0N.jpg').
        should.eventually.
        include({imageURL: 'http://i.imgur.com/emZNv0N.jpg', ext: '.jpg'}).
        and.property('imageName').match(/^product-image-/);
    });
  });


как видите, сам тест (внутри 'it') остался таким же, как и поведение самой функции. успех!

тестировать её помощников (request и write) не вижу смысла, т.к. это обёрнутые вызовы библиотечных\встроенных функций

Последний раз редактировалось melky, 04.02.2015 в 23:19.
Ответить с цитированием