2015-01-04 7 views
-1

У меня есть функция в JavaScript, который использует библиотеку q:как проверить ошибку в QUnit

validateOnSelection : function(model) { 
    this.context.service.doLofig(model).then(function(bResult) { 
     if (bResult) { 
      return true; 
     } else { 
      throw new Error(that.context.i18n.getText("i18n", "error")); 
     } 
    }); 
} 

Как я могу проверить в QUnit, что результат ошибки? Предположим, что результат: bResult - false и Error должен поднять.

Я пробовал:

test("Basic test ", { 
    // get the oTemplate and model 

    return oTemplate.validateOnSelection(model).then(function(bResult) { 
     // Now I need to check the error 
    }); 

})); 

Проблема, что я не получил чек «// Теперь мне нужно проверить ошибку»

+0

Do не нужна функция, чтобы использовать оператор возврата? :) –

+0

Да, там что-то не так, я пишу ответ сейчас ... – jakerella

+0

@jakerella OK. Я не буду делать то же самое. :) Не забывайте упоминать 'asyncTest, останавливать, начинать и бросать' :) –

ответ

1

Есть много проблем здесь. Во-первых, у вас нет способа сообщить вызывающему коду, что ваша функция закончена. Без этого QUnit не может определить, когда запускать утверждения. Затем вам нужно будет использовать команду QUnit async ability, иначе тестовая функция завершится до того, как ваше обещание будет разрешено. Кроме того, вы можете использовать throws assertion, чтобы проверить наличие ошибки. В приведенном ниже примере используется версия QUnit версии 1.16.0 (новейшая версия).

validateOnSelection : function(model) { 
    // Instead, return a promise from this method which your calling code can use: 
    var deferred = Q.defer(); 

    this.context.service.doLofig(model).then(function(bResult) { 
     if (bResult) { 
      // return true; this doesn't really do anything, it doesn't return anywhere. 
      // instead, resolve the promise: 
      deferred.resolve(true); 
     } else { 
      // we don't really want to "throw" here, we nee to reject the promise: 
      // throw new Error(that.context.i18n.getText("i18n", "error")); 
      deferred.reject(new Error(that.context.i18n.getText("i18n", "error"))); 
     } 
    }); 

    return deferred.promise; 
} 

Теперь мы можем установить наш тест, чтобы ждать обещанного до конца, а затем проверить результат ...

QUnit.test("Basic test", function(assert) { 
    // get the oTemplate and model 

    var done = QUnit.async(); // call this function when the promise is complete 

    // where does `model` come from??? 
    oTemplate.validateOnSelection(model).then(function(bResult) { 
     // Now I need to check the error 
     assert.ok(bResult instanceof Error, "We should get an error in this case"); 

     done(); // now we let QUnit know that async actions are complete. 
    }); 
}); 
+0

Как я могу использовать с бросками? – user1365697

+0

Ошибка в riase в validateSelection, и я хочу поймать ее в qunit. Я не могу изменить логику validateSelection – user1365697

+0

Вы не должны использовать 'throws' с учетом вашей настройки. Метод 'validateOnSelection()' является асинхронным из-за обещания, поэтому вам нужно сообщить QUnit, когда все будет готово. Это произойдет либо через другое обещание (как я покажу вам), либо через обратный вызов. – jakerella

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