 
			
				18.10.2014, 14:02
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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 , но если без него не получится, то скиньте пожалуйста пример, как это сделать с ним.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				18.10.2014, 14:10
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 sinistral 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				18.10.2014, 14:52
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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();
    });
  });
});
	 | 
 
	
 
 Спасибо большое за информацию! 
А протестировать, нужно конкретно то, что функция коллбек возвращает результат и что этот результат правльный  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				18.10.2014, 16:12
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 sinistral 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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);
  });
});
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				18.10.2014, 20:20
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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);
  });
});
	 | 
 
	
 
 А вы уверенны? А то, что-то не работает?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				18.10.2014, 21:43
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 sinistral 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.03.2011 
					
					
					
						Сообщений: 5,418
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Armen
			 
		
	 | 
 
	| 
		А вы уверенны? А то, что-то не работает?
	 | 
 
	
 
 Всё работает. только нужно настроить Chai для режима сравнений "should". или я не понял)
 http://runnable.com/VEKnOzWERn9jjdG2...nd-hello-world
Нажать на "Run". там же файлы, где что делается  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось melky, 18.10.2014 в 21:45.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				18.10.2014, 22:35
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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);
  });
});
	 | 
 
	
 
 Выводит ошибку ReferenceError: Can't find variable: require  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				18.10.2014, 23:56
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 sinistral 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.03.2011 
					
					
					
						Сообщений: 5,418
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Armen
			
		
	 | 
 
	| 
		Выводит ошибку ReferenceError: Can't find variable: require
	 | 
 
	
 
 это вопрос окружения. я запускаю в node.js и там есть require  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				19.10.2014, 18:53
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 28.06.2009 
					
					
					
						Сообщений: 120
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от melky
			 
		
	 | 
 
	| 
		это вопрос окружения. я запускаю в node.js и там есть require
	 | 
 
	
 
 А можно ли протестировать callback без chai? А только с помощью mocha?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |