Жасмин, чтобы проверить, имеет ли объект определенный метод или нет
Я использую Jasmine, и я хочу проверить, имеет ли объект определенный метод или нет, например ниже:
it "should have 'open' method", ->
@xhr = ajax.create()
expect(@xhr).toHaveMethod "open" # I want to test like this!
Как я могу проверить? Спасибо за вашу доброту.
Ответы
Ответ 1
Существует не встроенный способ сделать это, но вы можете достичь желаемого результата, выполнив это.
it "should have 'open' method", ->
@xhr = ajax.create()
expect(typeof @xhr.open).toBe("function")
Обратите внимание, что тестирование, если оно определено как предложено в другом ответе, имеет некоторые случаи кросс, где он пройдет, и это не должно. Если вы возьмете следующую структуру, она пройдет, и это определенно не функция.
{ open : 1 }
Ответ 2
@david ответил правильно. toBeDefined()
, вероятно, то, что вы хотите. Однако, если вы хотите проверить, что это функция, а не свойство, вы можете использовать toEqual()
с jasmine.any(Function)
. Вот пример: http://jsbin.com/eREYACe/1/edit
Ответ 3
Я бы попробовал:
it "should have 'open' method", ->
@xhr = ajax.create()
expect(@xhr.open).toBeDefined()
см. этот fiddle.
Ответ 4
Я сделал это так. Пример Angular:
beforeEach(inject(function ($injector) {
service = $injector.get("myService");
}));
it("should have myfunction function", function () {
expect(angular.isFunction(service.myfunction)).toBe(true);
});
Ответ 5
Жасмин позволяет вам писать свои "матчи". Документация объясняет это.
http://jasmine.github.io/2.0/custom_matcher.html
Вы можете написать очень специфичный матчи, который называется
expect(obj).toHaveMethod("methodName");
Лично я бы написал нечто более общее, которое проверяет тип значения. Таким образом, я мог бы использовать его, чтобы не просто проверить, установлен ли метод, и объект/экземпляр, но все, что может сохранить значение. Это также дает возможность проверить типы, кроме типа функции.
expect(obj.methodName).toBeA(Function);
Чтобы заставить его работать, вам нужно обязательно добавить toBeA "matcher".
beforeEach(function(){
jasmine.addMatchers({
toBeA: toBeA
});
});
function toBeA() {
return {
compare: function (value, type) {
var result = {pass: val != null && val.constructor === type || val instanceof type};
if (result.pass) {
result.message = 'Expected ' + value + ' to be a ' + type.name
} else {
result.message = 'Expected ' + value + ' to not be a ' + type.name
}
return result;
}
};
}
Ответ 6
Я пробовал это решение, и он работает:
spyOn(@xhr,"open")
Если функция не открыта, она будет вызывать ошибку, потому что она не может запустить spyig на ней