2014-06-17 3 views
1

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

Код тестируемой:

exports.inGroup = (group, user) -> 
    return user.groups.indexOf(group) >= 0 

## 
# A promise returning function that returns the list 
# of viewable channels for a user. 
## 
exports.getUserViewableChannels = (user) -> 

    # if admin allow all channels 
    if exports.inGroup 'admin', user 
     return Channel.find({}).exec() 
    else   
     # otherwise figure out what this user can view 
     return Channel.find({ txViewAcl: { $in: user.groups } }).exec() 

Теперь, когда я проверяю пользователя, не админ это работает отлично:

user = new User 
    firstname: 'Some' 
    surname: 'User' 
    email: '[email protected]' 
    groups: [ 'HISP' , 'group2' ] 

it "should return channels that a user can view", (done) -> 
    promise = authorisation.getUserViewableChannels user 
    promise.then (channels) -> 
     channels.should.have.length(2) 
     done() 
    , (err) -> 
     done err 

Однако, когда я испытываю пользователя админ обещание не постановляю:

user3 = new User 
    firstname: 'Random' 
    surname: 'User' 
    email: '[email protected]' 
    groups: [ 'admin' ] 

it "should return all channels for viewing if a user is in the admin group", (done) -> 
    promise = authorisation.getUserViewableChannels user3 
    promise.then (channels) -> 
     channels.should.have.length(3) 
     done() 
    , (err) -> 
     done err 

В этом случае времена испытаний мокко из:

Error: timeout of 2000ms exceeded 
+0

Просто случайный совет: Mocha поддерживает обещания из коробки в последних версиях, вы можете просто вернуть обещание и тест будет проходить или не на основе выполняет ли он/отклоняет соответственно. –

+0

О, потрясающе! Спасибо, что я этого не знал. –

ответ

3

Ну, это грязно, но - если утверждение channels.should.have.length(2) не удается, происходят плохие вещи. У вас нет обработчика .catch на , что утверждение означает, что обещание будет отклонено.

Поскольку mpromise (обещания Mongoose) не имеют никакого хорошего необработанного обнаружения отторжения, это вызовет молчащий отказ от обещания, и так как done никогда не вызывается в этом случае, Mocha не знает, что делать. Я настоятельно рекомендую использовать Bluebird над обещаниями Mongoose, поскольку они оба быстрее (да, даже с Mongoose) и не позволят сильным сбоям произойти подобным образом и будут отслеживать их для вас.

Следующее, используя новый синтаксис обещания, предлагаемый Mocha в последних версиях, должно работать.

it "should return all channels for viewing if a user is in the admin group",() -> 
    promise = authorisation.getUserViewableChannels user3 
    promise.then (channels) -> 
     channels.should.have.length(3) 
+0

Огромное спасибо, это помогло. Я не мог вернуть обещание Мокке, поскольку мне все еще нужно было дать утверждение. То, что я сделал, было обернуть тело функции onResolve в попытке поймать. Это позволило мне выяснить основную проблему, которая вызывала ошибку утверждения. Благодаря! –

+1

@ RyanCrichton это никогда не произойдет, если вы вместо этого воспользуетесь обещаниями Bluebird. Я бы посмотрел на него, если бы я был вам, это спасло меня много времени. Рад, что смог помочь. –

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