Как обработать и тестировать ошибку отсутствия обязательных аргументов конструктора при создании объекта?

Как можно недать конструктору создать экземпляр, если не переданы обязательные аргументы(соответственно надо обозначить эти обязательные аргументы) и проверить всё это тестом.
Правильный вариант, в соответствии с решением, предложенным @mudrenokanton
// код
"use strict";
var Checkbox = function(elementId,target,expression){
    if(elementId == undefined || target == undefined || expression == undefined){
        return {error:true}
    }
    // ...
};
// тест
describe("simple create class object Checkbox", function () {
    it("should throw exception with no arguments", function () {
        var object = new Checkbox();
        assert(object.error)
    });
});

https://jsfiddle.net/Quncore/hxzycx5y/
  • Вопрос задан
  • 314 просмотров
Решения вопроса 1
mudrenokanton
@mudrenokanton
frontend dev
var object = function(){new Checkbox();};
assert.throws(object)

Что тут вообще происходит? Вы передаете тело функции в assert, вы же ничего не вызываете и ни с чем не сравниваете.

Если хотите предотвратить действие, то пишите в блоке try catch.
По хорошему лучше создавать фабричный обьект, а потом вызывать для него initialize(...params) в котором уже делать нужную проверку. Зачем вам эта имитация работы конструкторов.

upd. А еще вы должны врубиться, что никаких конструкоторов нет, это просто вызов функции в котором вы можете делать что захотите:
var Construct = function(a, b) { 
    var error = {}; 
    error.message = "wrong params"; 
    if (true) { return error }; //делаете тут проверку
    // а тут дальше пишите ваш "конструктор"
};
var a = new Construct();  // Object {message: "wrong params"}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Эх, что только люди не делают, чтобы пофиксить JS.

Лучший способ тестировать ошибку отсутствия обязательных аргументов - пользоваться TypeScript.

Что касается вашего варианта - я бы делал строгую проверку на undefined, т.к. в качестве значения аргумента иногда вполне может передаваться null - тогда ваша проверка не будет корректно отрабатывать.
Ответ написан
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
function Checkbox(elementId, target, expression) {
  if(arguments.length < 3) {
    throw new Error('Не переданы обязательные аргументы!');
  }
  // Ваш код
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы