Jasmine测试中 toHaveBeenCalled、toHaveBeenCalledWith、toHaveBeenCalledTimes

本文详细介绍了在Jasmine测试框架中,如何使用toHaveBeenCalled检查方法是否被调用,使用toHaveBeenCalledWith判断调用时的参数是否匹配,以及使用toHaveBeenCalledTimes确认调用次数。这些工具对于前端typescript和javascript的测试至关重要。参考资源包括Jasmine官方教程和ngx-tethys开源组件库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值