如何配置服务以进行角度单元测试
其中一个服务(ProductService)依赖于LoggerService,想要对ProductService执行单元测试。 Spyobj Loggerservice 在测试床的提供者中注册,并且在测试用例中将使用 TestBed.Inject(ProductService) 获取 ProductService。
将测试用例与 angular.io 中可用的示例之一进行比较 -> https://angular.io/guide/testing-services 在示例中,服务和依赖服务都在测试台的提供者中注册。
在使用 TestBed.Inject 获取 ProductService 之前,我们是否需要在测试台的提供程序数组中注册?
let masterService: MasterService;
let valueServiceSpy: jasmine.SpyObj<ValueService>;
beforeEach(() => {
const spy = jasmine.createSpyObj('ValueService', ['getValue']);
TestBed.configureTestingModule({
// Provide both the service-to-test and its (spy) dependency
providers: [
MasterService,
{ provide: ValueService, useValue: spy }
]
});
// Inject both the service-to-test and its (spy) dependency
masterService = TestBed.inject(MasterService);
valueServiceSpy = TestBed.inject(ValueService) as jasmine.SpyObj<ValueService>;
});
export class LogserviceService {
constructor() { }
public logMessage(value:string)
{
console.log(value);
}
}
export class ProductService {
products:IProduct[]=[];
constructor(private logservice:LogserviceService) {
console.log('getting the service created');
console.log(logservice);
console.log(logservice instanceof (LogserviceService));
}
getProducts(): IProduct[] {
this.products =
[
{name:"TV",cost:100,model:"123434",category:"Electronics"},
];
this.logservice.logMessage("I am in the product service");
return this.products;
}
getProduct(category:string):IProduct[]
{
this.logservice.logMessage("callling getProduct");
let products = this.getProducts();
let prodct= products.filter(x=>x.category ===category);
return prodct;
}
}
describe('ProductService', () => {
let service: ProductService;
let logService: LogserviceService;
logService = jasmine.createSpyObj(['logMessage']);
beforeEach(() => {
TestBed.configureTestingModule({
providers: [{ provide: LogserviceService, useValue: logService },
],
});
});
it('should get the product list, if valid caterogy is sent', () => {
let service = TestBed.inject(ProductService); //product service not registered in the providers
let products = service.getProduct('Electronics');
expect(products.length).toBeGreaterThan(0);
expect(logService.logMessage).toHaveBeenCalledWith('callling getProduct');
expect(products[0].category).toEqual('Electronics');
});
});
One of the service(ProductService) is dependent on the LoggerService, want to perform the unit testing ofProductService.
Spyobj Loggerservice is registered in the provider of the testbed and in the testcase will get the ProductService using TestBed.Inject(ProductService).
Compared testcase with the one of the example available in the angular.io -> https://angular.io/guide/testing-services
In the example both Service and dependent service are registered in the provider of the testbed.
Do we need to register in the provider array of the test bed before getting the ProductService using TestBed.Inject?
let masterService: MasterService;
let valueServiceSpy: jasmine.SpyObj<ValueService>;
beforeEach(() => {
const spy = jasmine.createSpyObj('ValueService', ['getValue']);
TestBed.configureTestingModule({
// Provide both the service-to-test and its (spy) dependency
providers: [
MasterService,
{ provide: ValueService, useValue: spy }
]
});
// Inject both the service-to-test and its (spy) dependency
masterService = TestBed.inject(MasterService);
valueServiceSpy = TestBed.inject(ValueService) as jasmine.SpyObj<ValueService>;
});
export class LogserviceService {
constructor() { }
public logMessage(value:string)
{
console.log(value);
}
}
export class ProductService {
products:IProduct[]=[];
constructor(private logservice:LogserviceService) {
console.log('getting the service created');
console.log(logservice);
console.log(logservice instanceof (LogserviceService));
}
getProducts(): IProduct[] {
this.products =
[
{name:"TV",cost:100,model:"123434",category:"Electronics"},
];
this.logservice.logMessage("I am in the product service");
return this.products;
}
getProduct(category:string):IProduct[]
{
this.logservice.logMessage("callling getProduct");
let products = this.getProducts();
let prodct= products.filter(x=>x.category ===category);
return prodct;
}
}
describe('ProductService', () => {
let service: ProductService;
let logService: LogserviceService;
logService = jasmine.createSpyObj(['logMessage']);
beforeEach(() => {
TestBed.configureTestingModule({
providers: [{ provide: LogserviceService, useValue: logService },
],
});
});
it('should get the product list, if valid caterogy is sent', () => {
let service = TestBed.inject(ProductService); //product service not registered in the providers
let products = service.getProduct('Electronics');
expect(products.length).toBeGreaterThan(0);
expect(logService.logMessage).toHaveBeenCalledWith('callling getProduct');
expect(products[0].category).toEqual('Electronics');
});
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论