2
votes

I caught this error when i made test for angular test.following are parts of my code. Failed: this.strategyService.getAllstrategys(...).subscribe is not a function TypeError: this.strategyService.getAllstrategys(...).subscribe is not a function

//In strategyTables.component.ts
getStrategys():void{
    this.strategyService.getAllstrategys(this.strategyname,this.isuseragent,this.iscookie,this.currentpage,this.itemsPerPage,this.sorts).subscribe(data=>{
        this.totalItems=data.json().totalElements;
        this.currentPage=data.json().number+1;
        this.strategys=data.json().content;
        for(var i=0;i<data.json().totalPages;i++){
          this.totalnumbers[i]=i+1;
        }
      },
      error => console.log(error),()=>console.log("获取到所有的urlmng"));
  }

//In strategyTables.component.spec.ts
class MockStrategyTablesService extends StrategyTablesService{
  //noinspection JSAnnotator
  getAllstrategys(strategyname:string ,isuseragent:string ,iscookie:string ,page:number,
                  size:number,sorts:string){
    return{
      "content" : [ {
        "id" : 11,
        "strategyname" : "strategy11",
        "isuseragent" : "是",
        "depth" : 2,
        "downloadDelay" : 3,
        "iscookie" : "yes",
        "agent" : null,
        "starttime" : ""
      }, {
        "id" : 10,
        "strategyname" : "策略",
        "isuseragent" : "是",
        "depth" : 2,
        "downloadDelay" : 2,
        "iscookie" : "否",
        "agent" : "2",
        "starttime" : "2017年2月2日 14:44:47"
      }, {
        "id" : 9,
        "strategyname" : "策略9",
        "isuseragent" : "是",
        "depth" : 3,
        "downloadDelay" : 5,
        "iscookie" : "否",
        "agent" : "1",
        "starttime" : "2017年2月2日 14:41:56"
      }, {
        "id" : 6,
        "strategyname" : "策略6",
        "isuseragent" : "是",
        "depth" : 10,
        "downloadDelay" : 3,
        "iscookie" : "否",
        "agent" : null,
        "starttime" : "2017-03-09 15:08:56"
      }, {
        "id" : 5,
        "strategyname" : "策略5",
        "isuseragent" : "是",
        "depth" : 10,
        "downloadDelay" : 3,
        "iscookie" : "否",
        "agent" : null,
        "starttime" : "2017-03-01 15:08:53"
      } ],
      "last" : false,
      "totalPages" : 2,
      "totalElements" : 8,
      "size" : 5,
      "number" : 0,
      "sort" : [ {
        "direction" : "DESC",
        "property" : "id",
        "ignoreCase" : false,
        "nullHandling" : "NATIVE",
        "ascending" : false
      } ],
      "first" : true,
      "numberOfElements" : 5
    }
  }
}
describe('strategyTable.component',()=>{

  let compp;
  beforeEach(()=>{
    TestBed.configureTestingModule({
      imports:[HttpModule,RouterTestingModule],
      providers:[
        StrategyTables,
        {provide:StrategyTablesService,useClass:MockStrategyTablesService},
        Location,
      ]
    });
    
  });

   beforeEach(inject([StrategyTables],s => {
   compp = s;
   }));

   it('test',async(()=>{
     compp.getStrategys();
     expect(compp.totalItems).toEqual(8);
   }));

});
1
you are not returning any Observable from getAllstrategysPengyy
Sorry i don't understand,Can you give me some specific advice?I‘ve just learned this for two daysW.Wei

1 Answers

1
votes

Your mock implementation of getAllstrategys returns a plain object instead of an Observable. You can easily convert a plain object into an Observable by using Observable.of:

import { Observable } from "rxjs/Rx";
// ...

getAllstrategys(strategyname: string, isuseragent: string, iscookie: string, page: number,
    size: number, sorts: string) {
    var mockData = {
        "content": [{
            "id": 11,
            "strategyname": "strategy11",
            "isuseragent": "是",
            "depth": 2,
            "downloadDelay": 3,
            "iscookie": "yes",
            "agent": null,
            "starttime": ""
        },
        // ...    
        ],
        "last": false,
        "totalPages": 2,
        "totalElements": 8,
        "size": 5,
        "number": 0,
        "sort": [{
            "direction": "DESC",
            "property": "id",
            "ignoreCase": false,
            "nullHandling": "NATIVE",
            "ascending": false
        }],
        "first": true,
        "numberOfElements": 5
    }
    return Observable.of({
        json: () => mockData
    });
}