【问题标题】:ReferenceError: service is not definedReferenceError:服务未定义
【发布时间】:2018-11-11 10:57:50
【问题描述】:

我尝试测试服务,http post,如下面的代码。

我按照此post 进行测试,但出现错误。

我的服务代码:

  public CreateProduct(newProd: Product): Observable<boolean> {
    .....
    let body = newProd.generateUrlencodedParameters(this.currentuser().token);
    return this.http.post(API.getUrl(Api.URLS.CreateProduct), body, {
      headers: headers
    })
      .map((response: Response) => {
        let res = response.json();

        if (res.StatusCode === 0) {
          return true;
        }
    }

我的班级产品:

export class Product{
    id: number;
    prod_number: String;
    prod_name: string;

    constructor(obj: any) {
        this.id= obj.id;
        this.prod_number= obj.prod_number;
        this.prod_name= obj.prod_name;
    }
    public generateUrlencodedParameters(token: string, id?: number): string 
   {
        let urlSearchParams = new URLSearchParams();
        urlSearchParams.append('prod_number', this.prod_number.toString());
        urlSearchParams.append('prod_name', this.prod_name.toString());
        urlSearchParams.append('token', token);
        return urlSearchParams.toString();
    }
}

我尝试了这段代码,以测试我的服务代码:

describe('Create Product ', () => {
    let trackerFormService: ProductService,
      mockService = {
        createProduct: jasmine.createSpy('createProduct').and.returnValue(Observable.of('your session object mock goes here'))
      };
        beforeEach(() => {
        TestBed.configureTestingModule({
          imports: [HttpModule],
          providers: [{
            provide: ProductService,
            useValue: mockService
          }] }); });

      beforeEach(inject([ProductService], (trackerFormService) => {
        service = trackerFormService;
      }));
      describe('createProduct', () => {
        it('add session ', () => {
          let fakeResponse = null;
          service.CreateProduct().subscribe((value) => {
            fakeResponse = value;
          }); }); });});

结果是:

ReferenceError: 服务未定义

请您给我任何想法,如何解决此问题,或任何测试服务帖子的示例。

谢谢。

【问题讨论】:

  • 您确定将服务添加到需要该服务的组件中的提供者和构造函数中吗?
  • 是的。现在我只想测试服务。

标签: angular unit-testing testing post jasmine


【解决方案1】:

一种方法是更改​​ beforeEach 函数,如下所示:

    beforeEach(() => {
      TestBed.configureTestingModule({
          imports: [HttpModule],
          providers: [{
            provide: ProductService,
            useValue: mockService
          }] });
      service = TestBed.get(ProductService);
      });

编辑:

describe('Create Product ', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
        imports: [HttpModule],
        providers: [{
          provide: ProductService,
          useValue: mockService
        }] });
    });
  it('add session ', inject([ProductService], (service: ProductService) => { 
        let fakeResponse = null;
        service.CreateProduct().subscribe((value) => {
          fakeResponse = value;
        });
      })
    });

编辑:您可以为 ProductService 使用假货。但这意味着您没有测试 ProductService。我不确定您要在这里测试什么。

你可以试试:(注意传入的参数)

    mockService = {
  createProduct: (newProduct) => jasmine.createSpy('createProduct').and.returnValue(Observable.of(false))
};

或者在一个新文件中创建以下类。

export class FakeProductService {
  public CreateProduct(newProd: Product): Observable<boolean> {
    return Observable.of(false);
  }
}

在您的测试文件中。

describe('Create Product ', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
        imports: [HttpModule],
        providers: [{
          provide: ProductService,
          useClass: FakeProductService
        }] });
    });
  it('add session ', inject([ProductService], (service: ProductService) => { 
        let fakeResponse = null;
        service.CreateProduct(\*new Product()*\).subscribe((value) => {
          fakeResponse = value;
        });
      })
    });

【讨论】:

  • 我像你说的那样试过了,但没有任何反应。我认为问题出在beforeEach(inject([ProductService], (trackerFormService) =&gt; { service = trackerFormService; }));中的这项服务@
  • 删除旧的 beforeEach 函数,因为它不再需要,并将您刚刚在 describe 函数中创建的函数移到 it 函数之前。
  • 预期有 1 个参数,但在 service.CreateProduct() 中得到了 0。这是因为我有 public CreateProduct(newProd: Product): Observable&lt;boolean&gt; {
  • 这与测试无关,现在服务已声明并开始工作。您需要修复为方法传递的内容。
  • 是但显示此错误:TypeError: service.CreateProduct is not a function
猜你喜欢
  • 2019-06-09
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多