Подтвердить что ты не робот

Жасмин, чтобы проверить, имеет ли объект определенный метод или нет

Я использую Jasmine, и я хочу проверить, имеет ли объект определенный метод или нет, например ниже:

it "should have 'open' method", ->
    @xhr = ajax.create()
    expect(@xhr).toHaveMethod "open" # I want to test like this!

Как я могу проверить? Спасибо за вашу доброту.

4b9b3361

Ответ 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 на ней