单元测试角度2服务注入后不运行回调

dee*_*eek 14 unit-testing karma-jasmine angular

所以我已经为我的组件创建了单元测试,但是需要一些单独的服务.但是,当我尝试注入它们时(正在测试的服务方法不是异步).

describe('SearchService', () => {
    beforeEach(() => {
        TestBed.configureTestingModule({
            providers: [
                SearchService
            ]
        });

    });


    it("should build Url String", () => {
        inject([SearchService], (searchService: SearchService) => {
            spyOn(searchService, 'buildURL');
            console.log("should be logging like a boss");
            searchService.buildURL("test", "coursename", 2);
            expect(searchService.buildURL).toHaveBeenCalled();
            expect(searchService.buildURL("test", "coursename", 2)).toBe(['1']);
            expect(searchService.buildURL("test", "coursename", 2)).toBeFalsy();
        });
    });

});
Run Code Online (Sandbox Code Playgroud)

注入从未实际运行回调!test识别它的声明但是没有错误地传递.

内部的console.log语句从不运行,并且测试设计为失败传递,因此我假设注入无法运行.

Ant*_*vić 3

您只是额外嵌套了 1 个clojure,这就是它不起作用的原因。

it("should build Url String", () => {
        inject([SearchService], (searchService: SearchService) => {
            spyOn(searchService, 'buildURL');
            console.log("should be logging like a boss");
            searchService.buildURL("test", "coursename", 2);
            expect(searchService.buildURL).toHaveBeenCalled();
            expect(searchService.buildURL("test", "coursename", 2)).toBe(['1']);
            expect(searchService.buildURL("test", "coursename", 2)).toBeFalsy();
        });
    });
Run Code Online (Sandbox Code Playgroud)

像下面这样更改它以使其工作:

it("should build Url String", inject([SearchService], (searchService: SearchService) => {
            spyOn(searchService, 'buildURL');
            console.log("should be logging like a boss");
            searchService.buildURL("test", "coursename", 2);
            expect(searchService.buildURL).toHaveBeenCalled();
            expect(searchService.buildURL("test", "coursename", 2)).toBe(['1']);
            expect(searchService.buildURL("test", "coursename", 2)).toBeFalsy();
    })
);
Run Code Online (Sandbox Code Playgroud)

原因是,由于您inject在另一个范围内执行clojure,它将在另一个范围内执行它,因此 的第二个参数it应该是一个带有测试的函数,但由于您传入了一个空值,clojure它只会解析为true.

以下是正在发生的情况的示例:

() => { // calling this clojure it will return null/undefined
  () => { // calling this clojure it will return '1'
    return '1';
  }
}
Run Code Online (Sandbox Code Playgroud)