2016-02-25 3 views
2

У меня есть объект, и я пытаюсь выполнить тестирование одного из его методов с помощью Jasmine. Ошибка, которую я получаю, - undefined is not a function (evaluation foo.initArr()).Невозможно использовать метод прототипа прототипа

foo.js

function Foo(value) { 
    if(typeof value !== "string") { 
    value = ""; 
    } 

    var foo = { 
    value: value 
    }; 

    return foo; 
}; 

Foo.prototype.initArr = function(arr) { 
    if(arr) { 
    // do nothing 
    } else { 
    // initialize array 
    arr = []; 
    } 

    return arr; 
}; 

foo.spec.js

describe("foo.js", function() { 
    var validVal, 
    numberVal, 
    nullVal, 
    falseVal, 
    trueVal, 
    undefinedVal; 

    beforeEach(function() { 
    validVal = "PrQiweu"; 
    numberVal = 420; 
    nullVal = null; 
    falseVal = false; 
    trueVal = true; 
    undefinedVal = undefined; 
    }); 

    afterEach(function() { 
    validVal = null; 
    numberVal = null; 
    falseVal = null; 
    trueVal = null; 
    undefinedVal = null; 
    }); 

    describe("Foo:constructor", function() { 
    it("should return an empty string if the passed value isn't a string", function() { 
     var foo = new Foo(numberVal); 
     expect(foo.value).toEqual(""); 
    }); 

    it("should return a string if the passed value is a string", function() { 
     var foo = new Foo(validVal); 
     expect(foo.value).toEqual(jasmine.any(String)); 
    }); 

    describe("method:arr", function() { 

     it("should return an empty array if it wasn't passed one", function() { 
     var foo = new Foo(validVal); 
     expect(foo.initArr()).toBe([]);   
     }); 
    }) 
    }); 
}); 

Последний тест терпит неудачу. Я не думаю, что здесь тоже нужен шпион, но я могу ошибаться. Я понимаю, что функция initArr не имеет смысла, поэтому, пожалуйста, игнорируйте мой идиотизм.

Почему последний тестовый случай не работает, и как его исправить?

ответ

3

Ваша функция-конструктор возвращает другой foo, который не имеет функции прототипа.

function Foo(value) { 
    if(typeof value !== "string") { 
    value = ""; 
    } 

    var foo = { 
    value: value 
    }; 

    return foo; // This foo your locally defined foo var, 
}; 

Может быть, вы имели в виду, чтобы написать это:

function Foo(value) { 
    if(typeof value !== "string") { 
    value = ""; 
    } 
    this.value = value; 
}; 
Смежные вопросы