Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.10.2014, 14:02
Аватар для Armen
Кандидат Javascript-наук
Отправить личное сообщение для Armen Посмотреть профиль Найти все сообщения от Armen
 
Регистрация: 28.06.2009
Сообщений: 120

Как протистирова callback-функцию в mocha/chai ?
Здравствуйте, подскажите пожалуйста.
Как протестировать с помощью mocha или chai функцию коллбэк?
К примеру эту:
function getSum(a, b, callback) {
    if (callback && typeof callback === 'function') {
        return callback(a, b);
    }

    return a; // 5
}

getSum(5, 5, function (a, b) {
    return a + b; // 10
});

Спасибо.
P.S. желательно без sinonjs.org , но если без него не получится, то скиньте пожалуйста пример, как это сделать с ним.
Ответить с цитированием
  #2 (permalink)  
Старый 18.10.2014, 14:10
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

вообще это все на главной странице фреймворка написано ...
когда передаёшь callback в it, можно указать колбек для окончания теста
его сигнатура - node callback. то бишь первым параметром done ожидает получить ошибку.
describe('#find()', function(){
    it('respond with matching records', function(*!*done*/!*){
      db.find({ type: 'User' }, function(err, res){
        *!*if (err) return done(err);*/!*
        res.should.have.length(3);
        *!*done();*/!*
      })
    })
  })



в твоём случае можно и без sinon обойтись, но лучше его знать, дабы тесты выглядели простыми

Сообщение от Armen
Как протестировать с помощью mocha или chai функцию коллбэк?
всмысле. конкретно что нужно протестировать? сам факт вызова функции callback ? да, это sinon.

как именно - смотри страницу библиотеки. там второй пример показывает, что к чему:

it("calls the original function", function () {
    var callback = sinon.spy();
    var proxy = once(callback);

    proxy();

    assert(callback.called);
});


Если нужно проверить, что callback передаётся верное количество агрументов (и правильность самих агументов), см. в доку:
// вызван с аргументами arg1 и arg2 и более никакими
spyCall.calledWithExactly(arg1, arg2);


ну а вообще для сахарного использования sinon с chai, рекомендую этот модуль: sinon-chai

Если не смогёшь адаптировать свой код (или лень), вот спойлер:
function getSum(a, b, callback) {
    if (callback && typeof callback === 'function') {
        return callback(a, b);
    }

    return a; // 5
}


describe('getSum', function () {
  it('should pass in callback two numbers passed first', function (done) {
    getSum(5, 6, function (a, b) {
        a.should.be.equal(5);
        b.should.be.equal(6);
        done();
    });
  });
});

Последний раз редактировалось melky, 18.10.2014 в 14:24.
Ответить с цитированием
  #3 (permalink)  
Старый 18.10.2014, 14:52
Аватар для Armen
Кандидат Javascript-наук
Отправить личное сообщение для Armen Посмотреть профиль Найти все сообщения от Armen
 
Регистрация: 28.06.2009
Сообщений: 120

Сообщение от melky Посмотреть сообщение
вообще это все на главной странице фреймворка написано ...
когда передаёшь callback в it, можно указать колбек для окончания теста
его сигнатура - node callback. то бишь первым параметром done ожидает получить ошибку.
describe('#find()', function(){
    it('respond with matching records', function(*!*done*/!*){
      db.find({ type: 'User' }, function(err, res){
        *!*if (err) return done(err);*/!*
        res.should.have.length(3);
        *!*done();*/!*
      })
    })
  })



в твоём случае можно и без sinon обойтись, но лучше его знать, дабы тесты выглядели простыми


всмысле. конкретно что нужно протестировать? сам факт вызова функции callback ? да, это sinon.

как именно - смотри страницу библиотеки. там второй пример показывает, что к чему:

it("calls the original function", function () {
    var callback = sinon.spy();
    var proxy = once(callback);

    proxy();

    assert(callback.called);
});


Если нужно проверить, что callback передаётся верное количество агрументов (и правильность самих агументов), см. в доку:
// вызван с аргументами arg1 и arg2 и более никакими
spyCall.calledWithExactly(arg1, arg2);


ну а вообще для сахарного использования sinon с chai, рекомендую этот модуль: sinon-chai

Если не смогёшь адаптировать свой код (или лень), вот спойлер:
function getSum(a, b, callback) {
    if (callback && typeof callback === 'function') {
        return callback(a, b);
    }

    return a; // 5
}


describe('getSum', function () {
  it('should pass in callback two numbers passed first', function (done) {
    getSum(5, 6, function (a, b) {
        a.should.be.equal(5);
        b.should.be.equal(6);
        done();
    });
  });
});
Спасибо большое за информацию!
А протестировать, нужно конкретно то, что функция коллбек возвращает результат и что этот результат правльный
Ответить с цитированием
  #4 (permalink)  
Старый 18.10.2014, 16:12
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Armen
А протестировать, нужно конкретно то, что функция коллбек возвращает результат и что этот результат правльный
если операции синхронные, тогда это просто проверка возвращаемого результата:
как-то так:
function getSum(a, b, callback) {
    if (callback && typeof callback === 'function') {
        return callback(a, b);
    }

    return a; // 5
}

describe('getSum', function () {
  it('should sum two numbers', function () {

    var sum = getSum(5, 5, function (a, b) {
        return a + b; // 10
    });

    sum.should.be.equal(10);

  });
});
Ответить с цитированием
  #5 (permalink)  
Старый 18.10.2014, 20:20
Аватар для Armen
Кандидат Javascript-наук
Отправить личное сообщение для Armen Посмотреть профиль Найти все сообщения от Armen
 
Регистрация: 28.06.2009
Сообщений: 120

Сообщение от melky Посмотреть сообщение
если операции синхронные, тогда это просто проверка возвращаемого результата:
как-то так:
function getSum(a, b, callback) {
    if (callback && typeof callback === 'function') {
        return callback(a, b);
    }

    return a; // 5
}

describe('getSum', function () {
  it('should sum two numbers', function () {

    var sum = getSum(5, 5, function (a, b) {
        return a + b; // 10
    });

    sum.should.be.equal(10);

  });
});
А вы уверенны? А то, что-то не работает?
Ответить с цитированием
  #6 (permalink)  
Старый 18.10.2014, 21:43
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Armen Посмотреть сообщение
А вы уверенны? А то, что-то не работает?
Всё работает. только нужно настроить Chai для режима сравнений "should". или я не понял)

http://runnable.com/VEKnOzWERn9jjdG2...nd-hello-world

Нажать на "Run". там же файлы, где что делается

Последний раз редактировалось melky, 18.10.2014 в 21:45.
Ответить с цитированием
  #7 (permalink)  
Старый 18.10.2014, 22:35
Аватар для Armen
Кандидат Javascript-наук
Отправить личное сообщение для Armen Посмотреть профиль Найти все сообщения от Armen
 
Регистрация: 28.06.2009
Сообщений: 120

Сообщение от melky Посмотреть сообщение
если операции синхронные, тогда это просто проверка возвращаемого результата:
как-то так:
function getSum(a, b, callback) {
    if (callback && typeof callback === 'function') {
        return callback(a, b);
    }

    return a; // 5
}

describe('getSum', function () {
  it('should sum two numbers', function () {

    var sum = getSum(5, 5, function (a, b) {
        return a + b; // 10
    });

    sum.should.be.equal(10);

  });
});
Сообщение от melky Посмотреть сообщение
Всё работает. только нужно настроить Chai для режима сравнений "should". или я не понял)

http://runnable.com/VEKnOzWERn9jjdG2...nd-hello-world

Нажать на "Run". там же файлы, где что делается
Выводит ошибку ReferenceError: Can't find variable: require
Ответить с цитированием
  #8 (permalink)  
Старый 18.10.2014, 23:56
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Armen
Выводит ошибку ReferenceError: Can't find variable: require
это вопрос окружения. я запускаю в node.js и там есть require
Ответить с цитированием
  #9 (permalink)  
Старый 19.10.2014, 18:53
Аватар для Armen
Кандидат Javascript-наук
Отправить личное сообщение для Armen Посмотреть профиль Найти все сообщения от Armen
 
Регистрация: 28.06.2009
Сообщений: 120

Сообщение от melky Посмотреть сообщение
это вопрос окружения. я запускаю в node.js и там есть require
А можно ли протестировать callback без chai? А только с помощью mocha?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как передать измененные параметры AJAX в другую функцию? akselei Элементы интерфейса 2 19.10.2013 12:46
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как вызвать callback функцию oke11o jQuery 12 17.01.2012 13:36
как реализовать свою функцию к переменной czp Общие вопросы Javascript 2 01.01.2012 19:52
Как передать аргументы в callback функцию Artemiy-tlt jQuery 7 21.09.2011 15:08