toHaveBeenCalled
:如果调用了spy,则 toHaveBeenCalled 将通过调用。
toHaveBeenCalledWith
: 如果参数列表与spy调用时的参数相匹配,则返回true。
toHaveBeenCalledTimes
:如果spy被调用了指定的次数,则 toHaveBeenCalledTimes 将通过调用。
// The example comes from Jasmine official
describe("A spy", function() {
var foo, bar = null;
beforeEach(function() {
foo = {
setBar: function(value) {
bar = value;
}
};
spyOn(foo, 'setBar');
foo.setBar(123);
foo.setBar(456, 'another param');
});
it("tracks that the spy was called", function() {
expect(foo.setBar).toHaveBeenCalled();
});
it("tracks that the spy was called x times", function() {
expect(foo.setBar).toHaveBeenCalledTimes(2);
});
it("tracks all the arguments of its calls", function() {
expect(foo.setBar).toHaveBeenCalledWith(123);
expect(foo.setBar).toHaveBeenCalledWith(456, 'another param');
});
it("stops all execution on a function", function() {
expect(bar).toBeNull();
});
it("tracks if it was called at all", function() {
foo.setBar();
// Spy.calls.any() 检查spy是否被调用了
expect(foo.setBar.calls.any()).toEqual(true);
});
});
// The example comes from an open source component library called ngx-tethys)
// 需要被测试的方法:文件大小超过最大阈值的错误提示方法
export function sizeExceedsHandler(event: ThyFileSizeExceedsContext) {
const exceedsFilesMessage = event.exceedsFiles
.map(item => {
return `file: ${item.name}, size: ${item.size}`;
})
.join(',');
console.error(`some files(${exceedsFilesMessage}) size exceeds threshold ${event.sizeThreshold}`);
}
describe(`uploader-config`, () => {
it('should console incorrect error message for sizeExceedsHandler', () => {
const file1 = new File([''], 'file1.png');
// Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
Object.defineProperty(file1, 'size', { value: 1024 * 1024 + 1 });
const file2 = new File([], 'file2.txt');
Object.defineProperty(file2, 'size', { value: 1024 * 1024 + 2 });
// spyOn console.err()
const errorSpy = spyOn(console, 'error');
expect(errorSpy).not.toHaveBeenCalled();
sizeExceedsHandler({
files: [file1, file2],
exceedsFiles: [file1, file2],
nativeEvent: null,
sizeThreshold: 200
});
// errorSpy 被调用了
expect(errorSpy).toHaveBeenCalled();
// errorSpy 被调用了1次
expect(errorSpy).toHaveBeenCalledTimes(1);
// errorSpy 被调用时的参数是 `some files(file: ${file1.name}, size: ${file1.size},file: ${file2.name}, size: ${file2.size}) size exceeds threshold 200`
expect(errorSpy).toHaveBeenCalledWith(
`some files(file: ${file1.name}, size: ${file1.size},file: ${file2.name}, size: ${file2.size}) size exceeds threshold 200`
);
});
});
参考资料:
Jasmine官网:https://jasmine.github.io/tutorials/your_first_suite
开源组件库:https://github.com/atinc/ngx-tethys