简体   繁体   English

间谍返回值在使用 jasmine 的服务测试中无法正常工作

[英]Spy return value is not work correctly in Service test using jasmine

I'm not able to correctly mock my return value of a function inside my injected service in my Angular test.在我的 Angular 测试中,我无法在我的注入服务中正确模拟 function 的返回值。

I'm using:我在用着:

jasmine v2.8.0 and jasmine-core v2.8.0 jasmine v2.8.0 和 jasmine-core v2.8.0

I simplified the code to make it easier to understand.我简化了代码以使其更易于理解。 Here it is...这里是...

This is my Service what I want to test:这是我要测试的服务:

export class NetworkService {

  testNumber = 0;

  constructor(private networkReducerService: NetworkReducerService) {
    this.testNumber = networkReducerService.getNumber();
  }
}

This is my spec.ts这是我的spec.ts

describe('NetworkService', () => {

  let service: NetworkService;
  let networkReducerServiceSpy: jasmine.SpyObj<NetworkReducerService>;

  beforeEach(() => {

    const nRServiceSpy = jasmine.createSpyObj('NetworkReducerService', ['getNumber']);

    TestBed.configureTestingModule({
      providers: [NetworkService,
        {provide: NetworkReducerService, useValue: nRServiceSpy}
      ]
    });
    service = TestBed.get(NetworkService);
    networkReducerServiceSpy = TestBed.get(NetworkReducerService);
  });

  it('should have the following fields', () => {

    networkReducerServiceSpy.getNumber.and.returnValue(1);

    expect(networkReducerServiceSpy.getNumber).toHaveBeenCalled();

    expect(service.testNumber).toBe(1);
  });

});

I want to mock this getNumber method inside my NetworkReducerService我想在我的NetworkReducerService中模拟这个 getNumber 方法

@Injectable({
  providedIn: 'root'
})
export class NetworkReducerService {
  getNumber() {
    return 1;
  }
}

I get the following error:我收到以下错误:

Error: Expected undefined to be 1.错误:预期未定义为 1。

You are running into an "a before b" issue.您遇到了“a before b”问题。 You make the call to set testNumber in the constructor of your NetworkService class.NetworkService class 的构造函数中调用设置testNumber Therefore it is called when you first create the class - long before you change the value of your spy.因此,当您第一次创建 class 时会调用它 - 早在您更改间谍的值之前。 Either set the value before you instantiate the service, or refactor your NetworkService to set the value inside a method that can be tested by invoking after creation, rather than the constructor.在实例化服务之前设置值,或者重构NetworkService以将值设置在可以通过在创建后调用而不是构造函数来测试的方法中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM