Angular6-Jasmine:不使用组件即可测试服务

时间:2018-08-22 10:01:24

标签: angular jasmine karma-jasmine angular6

我有一个注入到AppModule中的服务,它是一个单例,它使用一个由swagger生成的API服务:

export class QueryService {

    public cache: Map<string, EvaluationResult> = new Map<string, EvaluationResult>();

    constructor(
        private queryService: QueryApi,
    ) { }

    public hashQueries(queries: Query[]): string {
        const hashedQueries: string[] = [];
        for (const query of queries) {
            hashedQueries.push(query.hashCode());
        }
        hashedQueries.sort();
        const hashcode = new Md5();
        hashcode.appendStr(hashedQueries.join(","));
        return (hashcode.end() as string);
    }
}

如您所见,该服务使用缓存。使用哈希码将每个查询保存到缓存中,并在调用该方法时检查查询是否已存在于缓存中。

我想编写一个检查哈希码功能是否有效的测试。目前我有这样的东西:

describe("QueryService", () => {

    it("should return a valid hashcode", () => {
        // make one type of query
        // make another type of query
        let service: QueryService;
        const queries = [attributeQuery, sodQuery];
        const hashcode = service.hashQueries(queries);
        expect(hashcode).toBeDefined();
        expect(hashcode.length).toBe(32);
    });

    it("should return the same hashcode", () => {
        // make two types of queries again but place them
        // in a different order
    });
    it("should return a different hashcode", () => {
        // make two types of queries again but change a
        // tiny detail so the hashcode is different
    });
}

如您所见,我想使用QueryService及其hashQueries()函数,而无需真正的组件。初始化这样的服务并不理想,因为它的构造函数需要另一个API服务,该服务也需要其他参数。

有使用该服务的简便方法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

除非您在测试规范中需要它们,否则您不必担心Dependency Injectors中的service。并且您无需使用service运算符来创建new对象。

您可以按照自己的规范进行以下操作,这将消除对DI参数的需要:

TestBed.get(QueryService)

describe("QueryService", () => {
   let service : QueryService;
    beforeEach(() => {
        TestBed.configureTestingModule({
            providers: [QueryService]
        });
        service = TestBed.get(QueryService);
    });

    it("should return a valid hashcode", () => {
        // make one type of query
        // make another type of query
        // let service: QueryService;          ---  No need to create service reference or object everytime
        const queries = [attributeQuery, sodQuery];
        const hashcode = service.hashQueries(queries);
        expect(hashcode).toBeDefined();
        expect(hashcode.length).toBe(32);
    });
}

如果您不关心Dependency Injectors中的service,则可以在使用null创建实例时,简单地将constructor作为new参数传递运算符。

let service = new QueryService(null);