如何进行同步测试或不共享存根服务?

3

我有一些需要服务的测试。我正在使用一个名为UserServiceStub的存根服务,将其注入到我正在测试的SettingsComponent中。我在每个测试中重置UserServiceStub,但是由于测试是异步执行的,所以当我重置我的UserServiceStub时(它是一个可注入和单例类),其他测试已经初始化了它。我的测试很薄弱,断言也是错误的 :-(

我想要进行同步测试或为每个测试使用不同的UserServiceStub实例,但我不知道怎么做...

我尝试在UserServiceStub中定义一个名为reset()的方法来重置存根服务,但由于它是异步的,所以它不起作用。此外,我在afterEach()方法中执行了TestBed.resetTestEnvironment()方法,但它也不起作用。

我的reset()方法:

reset() {
    this.user = { IBAN: '', SWIFT: '', paypal: '', app_idioma: '' };
  }
  • 我正在使用的属性名为user,但它已被其他测试覆盖

我的beforeEach()方法如下:

 let fixture: ComponentFixture<SettingsComponent>;
 let settingsComponent: SettingsComponent;
 beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [SettingsComponent],
      imports: [],
      providers: [
        TranslateService,
        AppService,
        { provide: MockBackend, useClass: MockBackend },
        { provide: HttpToolsService, useValue: HttpToolsServiceStub },
        { provide: BaseRequestOptions, useClass: BaseRequestOptions },
        { provide: UserService, useClass: UserServiceStub } // My stub UserService
      ]
    });

    fixture = TestBed.createComponent(SettingsComponent);
    settingsComponent = fixture.componentInstance;

  });

一项测试:

 it('#updateSettings should  doesn\'t update the user\'s settings when is wrong', fakeAsync(
    inject([UserService, HttpToolsService, MockBackend],
      (userService: UserServiceStub, httpToolsService: HttpToolsService, mockBackend: MockBackend) => {
        userService.reset(); // It does not work...
        userService.isError = true;
// However, I have reseted my user in UserServiceStub,
// this returns false because settingsComponent.getSettings().IBAN is actually 'XXX' 
// instead of '' (empty) how it has to be
        expect(settingsComponent.getSettings().IBAN).toBe(''); 
      }))
  );

我希望您能提供答案,如果您有任何问题,请随时问。谢谢 :-)

1个回答

0
你尝试使用getter/setter了吗?这样UserServiceStub.user的值就不会被修改了(如果我正确理解了你的意思)。
class UserServiceStub {
  // instead of:
  // this.user = { IBAN: '', SWIFT: '', paypal: '', app_idioma: '' };
  // use:
  get user() { return { IBAN: '', SWIFT: '', paypal: '', app_idioma: '' }; }
  set user(value) { /* test something here */ }
}

谢谢,但这不是我需要的。每个“用户”在每个测试中都有不同的信息,但是当一个测试结束时,UserServiceStub会保存最新测试的信息,而在执行另一个测试时,UserServiceStub已经发生了变化,我需要为每个测试提供不同的UserServiceStub。希望你能理解。 - Toni Villena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接