如何配置服务以进行角度单元测试

发布于 2025-01-15 03:54:14 字数 3438 浏览 1 评论 0原文

其中一个服务(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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文