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

Как заглушить метод jasmine mock object?

Согласно документации Jasmine, макет может быть создан следующим образом:

jasmine.createSpyObj(someObject, ['method1', 'method2', ... ]);

Как вы заглушите один из этих методов? Например, если вы хотите проверить, что происходит, когда метод генерирует исключение, как вы это сделаете?

4b9b3361

Ответ 1

Вам нужно связать method1, method2, как прокомментировал EricG, но не с andCallThrough() (или and.callThrough() в версии 2.0). Он будет делегировать реальную реализацию.

В этом случае вам нужно связать с and.callFake() и передать функцию, которую вы хотите вызвать (может генерировать исключение или что угодно):

var someObject = jasmine.createSpyObj('someObject', [ 'method1', 'method2' ]);
someObject.method1.and.callFake(function() {
    throw 'an-exception';
});

И затем вы можете проверить:

expect(yourFncCallingMethod1).toThrow('an-exception');

Ответ 2

Если вы используете Typescript, полезно использовать метод как Jasmine.Spy. В приведенном выше ответе (странно, у меня нет комментариев для комментариев):

(someObject.method1 as Jasmine.Spy).and.callFake(function() {
  throw 'an-exception';
});

Я не знаю, не переусердствовал ли я, потому что мне не хватает знаний...

Для Typescript я хочу:

  • Intellisense из базового типа
  • Возможность издеваться над методами, используемыми в функции

Я нашел это полезным:

namespace Services {
    class LogService {
        info(message: string, ...optionalParams: any[]) {
            if (optionalParams && optionalParams.length > 0) {
                console.log(message, optionalParams);
                return;
            }

            console.log(message);
        }
    }
}

class ExampleSystemUnderTest {
    constructor(private log: Services.LogService) {
    }

    doIt() {
        this.log.info('done');
    }
}

// I export this in a common test file 
// with other utils that all tests import
const asSpy = f => <jasmine.Spy>f;

describe('SomeTest', () => {
    let log: Services.LogService;
    let sut: ExampleSystemUnderTest;

    // ARRANGE
    beforeEach(() => {
        log = jasmine.createSpyObj('log', ['info', 'error']);
        sut = new ExampleSystemUnderTest(log);
    });

    it('should do', () => {
        // ACT
        sut.doIt();

        // ASSERT
        expect(asSpy(log.error)).not.toHaveBeenCalled();
        expect(asSpy(log.info)).toHaveBeenCalledTimes(1);
        expect(asSpy(log.info).calls.allArgs()).toEqual([
            ['done']
        ]);
    });
});