unit-testing - 如何进行同步测试或不共享 stub 服务?

标签 unit-testing testing angular jasmine

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

我想为每个测试做同步测试或不同的 UserServiceStub 实例,但我不知道该怎么做......

我试图在 UserServiceStub 中定义一个名为 reset() 的方法来重置 stub 服务,但因为它是异步的,所以它不起作用。另外,我在 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(''); 
      }))
  );

我希望你的答案,如果你有任何问题,尽管问。

谢谢:-)

最佳答案

您尝试过使用 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 */ }
}

关于unit-testing - 如何进行同步测试或不共享 stub 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39961133/

相关文章:

function - Perl - getlogin、getpwuid 和 $<

html - css对齐图像重叠

ruby-on-rails - Ruby on Rails 中的全栈测试选项

python - 使用pytest的parametrize,如果一个测试用例失败,我如何跳过剩余的测试?

unit-testing - 是否可以选择使用类似于 mockito argument captor 的东西?

javascript - Typescript 过滤并返回单个键

angular2 formBuilder 组异步验证

java - 用于测试多线程 Java 应用程序的确定性记录/重放框架

reactjs - UseEffect 钩子(Hook)的 Jest 测试用例

javascript - 为 Math.Random(); 编写测试用例;密码战套路