为什么 jasmine 会监视 return 一个函数?

why jasmine spy return a function?

我开始摆弄 jasmine,但我在使用这段代码时遇到了问题:

describe('UserService with errorsServiceSpy and testbed', () => {
    //how to test service that depends by another service
    let userService: UserService;
    let errorsServiceSpy: jasmine.SpyObj<ErrorsHandlerService>;

    beforeEach(() => {
        const spy = jasmine.createSpyObj('ErrorsHandleService', ['getErrors', 'addError']);

        TestBed.configureTestingModule({
            providers: [
                UserService, { provide: ErrorsHandlerService, useValue: spy }
              ]
        });

        userService = TestBed.inject(UserService);
        errorsServiceSpy = TestBed.inject(ErrorsHandlerService) as jasmine.SpyObj<ErrorsHandlerService>;
    });

    it('should be created', () => {
        expect(userService).toBeTruthy();
    });

    it('should return user', () => {
        expect(userService.getUser).toBe(userService.user)
    })

    it('#getErrors should return #error value from a spy', () => {
        const error:string = 'prova errore';
        userService.generateError(error)
        let errors:any = errorsServiceSpy.getErrors.toString()
        console.log('errors', errors)
        expect(errorsServiceSpy.getErrors.toString()).toContain(error)
    });

})

我声明没有 testBed 或没有 spy 的 testBed 我可以测试。 但是当我使用间谍 errorsServiceSpy.getErrors.toString () 应该 return 一个字符串数组时,它 return 是一个函数:'

function() {
    return fn.apply(this, arguments);
}

查看 stackblitz!
中的所有代码 由于 'this.errorsService',请不要关注失败的测试我认为这是一个 stackblitz 问题

为什么它return我一个函数?如何测试服务的方法? WHit testBed 和间谍?
如果您需要更多详细信息,我随时为您服务

你想错了,你不想得到错误,你想知道你的方法是否被调用了一个特定的参数,所以:

let errors:any = errorsServiceSpy.getErrors.toString()
expect(errorsServiceSpy.getErrors.toString()).toContain(error)

应该是:

expect(errorsServiceSpy.getErrors).toHaveBeenCalledWith(error);

虽然您实际上并没有展示 getErrors 的作用,但实际实施会有所不同。我建议你 read the docs

另外请与代码中的分号保持一致