【问题标题】:Testing simple angular component only with ngOnInit function仅使用 ngOnInit 函数测试简单的角度分量
【发布时间】:2018-06-13 05:43:54
【问题描述】:

在测试方面我是初学者,希望您能向我解释什么是好的做法。

我有一个简单的服务:

export class SessionService {
fetchFromStorage() {
    let x = localStorage.getItem('email');
    return JSON.parse(x);
}

saveInStorage(email) {
    localStorage.setItem('email', JSON.stringify(email));
}
}

以及使用该服务的组件:

export class LoginComponent implements OnInit, OnChanges {
email;

constructor(private service: SessionService) {
}

ngOnInit() {
    this.email = this.service.fetchFromStorage();
}

save() {
    this.service.saveInStorage(this.email);
}
}

我知道我应该创建 localStorageMock 吗?例如,在调用 saveInStorage() 之后,我必须检查 localStorageMock 是否包含我传递给该函数的参数? 我不确定如何测试 fetchFromStorage,我应该像这样在 localStorageMock 中创建吗:

export class {
getItem(x){
if(x = 'email') return 'sth';
}
}

第三个问题是关于我的组件中的 ngOnInit 是什么?写个测试是不是很简单?

【问题讨论】:

    标签: javascript angular unit-testing testing karma-runner


    【解决方案1】:

    我认为值得测试您的组件是否可以成功地从本地存储中获取数据,然后是否可以从那里获取数据。我将使用ng-test-runner 库让测试 Angular 组件更容易一些。

    我的组件有模板:

    <button class="update-button" (click)="save()"> </button>
    <input class="email-input" [(ngModel)]="email" />
    

    和测试:

    import {AppComponent} from "./app.component";
    import {AppModule} from "./app.module";
    import test, {App, click, expectThat, type} from "ng-test-runner";
    
    describe('Local storage Component', () => {
    
      let app: App;
      let store = {};
    
      beforeAll(() => {
        spyOn(localStorage, 'getItem').and.callFake(function (key) {
          return store[key];
        });
        spyOn(localStorage, 'setItem').and.callFake(function (key, value) {
          return store[key] = value + '';
        });
        spyOn(localStorage, 'clear').and.callFake(function () {
          store = {};
        });
      });
    
      beforeEach(() => {
        app = test(AppModule);
      });
    
      afterEach(() => {
        localStorage.clear();
      });
    
      it('fetch email from local storage', () => {
        localStorage.setItem('email', 'emailFromLocalStorage');
        const comp = app.run(AppComponent);
    
        comp.verify(
          expectThat.textOf('.email').isEqualTo('emailFromLocalStorage')
        );
      });
    
      it('update email in local storage', () => {
        localStorage.setItem('email', 'emailFromLocalStorage');
        const comp = app.run(AppComponent);
    
        comp.perform(
          type('newEmail@gmail.com').in('.email-input'),
          click.in('.update-button')
        );
    
        comp.verify(
          () => expect(localStorage.getItem('email')).toEqual('newEmail@gmail.com')
        );
      });
    });
    

    我只为 localStorage 创建了间谍。如果您将在 localStorage 上进行更多测试,最好将其提取到某个类中 - 然后您可以将其作为依赖项添加到您的测试中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 2014-06-21
      • 2022-01-22
      • 2017-11-20
      • 1970-01-01
      • 2020-04-21
      • 2016-06-01
      相关资源
      最近更新 更多