Как заглушить метод jasmine mock object?
Согласно документации Jasmine, макет может быть создан следующим образом:
jasmine.createSpyObj(someObject, ['method1', 'method2', ... ]);
Как вы заглушите один из этих методов? Например, если вы хотите проверить, что происходит, когда метод генерирует исключение, как вы это сделаете?
Ответы
Ответ 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']
]);
});
});