2015-07-31 2 views
2

Я пытаюсь создать тестовый пример с Mocha, но мой код является асинхронным.Ошибка обработчика ошибки асинхронного мокса

Это нормально, я могу добавить функцию «done» callback к «it», и это будет отлично работать для положительных случаев. Но, пытаясь проверить отрицательные случаи, он просто сделает тест неудачным.

Я хотел бы сделать что-то подобное, но асинхронные:

someObject.someMethod(null).should.equal(false)

Вместо этого я могу только тест для обратного вызова, чтобы вернуться, вместо того, чтобы испытывать то, что на самом деле случилось (нуль не действует):

it('this should return false or an error', function(done) { 
    someObject.someMethod(null, '', done); 
}); 

Я хотел бы написать что-то вроде этого:

it('this should return false or an error', function(done) { 
    someObject.someMethod(null, '', done).should.throw(); 
}); 

, но это привело бы к этой ошибке:

"TypeError: Cannot read property 'should' of undefined" 

Я также попытался с помощью рассчитывать и утверждать, но одни и те же правила.

Любые подсказки? Благодаря

EDIT # 1:

Я безуспешно пытался:

Использование истина/ложь

return (true); // ok 
retur (false); // error 

Использование обратного вызова:

callback(); // ok 
callback(err); // error 

Использование callback2:

callback(true); // ok 
callback(false); // error 

Использование callback3:

callback(null); // ok 
callback(new Error()); // error 

Использование броска (также внутри TRY/поймать блок):

// a 
throw new Error(); 
callback(); 

// b 
throw new Error(); 
callback(new Error()); 

// c 
throw new Error(); 
callback(false); 

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

EDIT # 2:

it('should throw', function(done) { 
    (function(done) { 
    someObject.someMethod(null, '', done) 
    }).should.throw(); 
});` 

EDIT # 3:

Завернуть на тестовой стороне:

it('this should return false or an error', function(done) { 
    someObject.someMethod(null, function(err, value) { 
     expect(value === false || err instanceof Error).toEqual(true); 
     return done(); 
    }); 
}); 

И на кодовой стороне: функции (вар, обратного вызова)

... 
callback(new Error('your comments'), false); 
// or 
callback(new Error('your comments')); 
... 
// if successful: 
callback(); 
// or 
callback(null); 
// or 
callback(null, 'foo'); 
+0

Как вы выбрасываете ошибку? –

+0

Я отредактировал вопрос, чтобы ответить на это, но я попробовал несколько комбинаций броска, ошибки, возврата ... – nico

ответ

1

Предполагая, что someObject.someMethod придерживается регулярного Node.js обратного вызова конвенции (ошибка в качестве первого аргумента, значение в качестве второго), вы могли бы использовать что-то вроде этого:

it('this should return false or an error', function(done) { 
    someObject.someMethod(null, '', function(err, value) { 
    (err instanceof Error || value === false).should.equal(true); 
    return done(); 
    }); 
}); 

I выведенный из имя тестового примера, который вы хотите проверить для двух ситуаций: либо метод «возвращает» ошибку, либо «возвращает» значение false (путем вызова функции обратного вызова с соответствующими аргументами).

+0

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

+0

Я, наконец, очистил код, и ваш синтаксис работает отлично. Поэтому либо '(значение === false || err instanceof Error) .should.equal (true);' или 'expect (значение === false || err instanceof Error) .toEqual (true);' work! – nico

0

Вы можете сделать завершение анонимной функцией и обработать (err,res) вручную и выполнить звонок с помощью жестко закодированных входов. Или:

(function(){ 
    throw new Error('fail'); 
}).should.throw(); 
+0

Я не совсем понимаю, что вы имеете в виду. Я пробовал это без каких-либо улучшений: (см. Edit # 2) – nico

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

  • Нет связанных вопросов^_^