Модульное тестирование базового класса с жасмином и angular - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть один базовый класс c, который я использую в каждом компоненте сетки.

Теперь у меня есть спецификации для компонента сетки, но я хочу добавить спецификации для базового класса в отдельный файл базы c.

Мотивом этого является удаление повторяющегося кода и создание универсального c spe c файла для базовой сетки, который будет обслуживаться для каждой сетки, использующей базовый класс.

Я застрял в одной точка, Я не могу создать спецификации внутри базового файла spe c. По сути, мне нужны все спецификации в базовом файле под одной функцией, и когда эта функция вызывается из подкласса с этим компонентом, она должна вернуть все спецификации для этого класса.

Вот что Я и то, что я пытался до сих пор.

Уровень компонента:

export class MyComponent extends BaseGrid<MyEntity> { 
    ... (and all other code like constructor and methods)... 
}

Базовый уровень:

export class BaseGrid<T> { 
    public async getData(): Promise<void> { ... }
}

... and 100 other functions

Характеристики компонентов :

describe('MyComponent ', () => {
    let component: MyComponent;
    let fixture: ComponentFixture<MyComponent>;

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            declarations: [MyComponent],
            imports: [
                ...
        ],
            providers: [
            ],
        }).compileComponents().then(() => {
            fixture = TestBed.createComponent(MyComponent);
            component = fixture.componentInstance;
        });
    }));

    // here I created a reference function for my base class spec
    // Now, This is working but I don't want this **describe** and **it** to be here, 
    // it should be in the base file. so I can remove this repetitive code from all components.
    // And From here I just want to call one function let's say a **baseGridSpecs(component)**, 
    // that will load all the specs of base class in this component.
    describe('Should initialize Base grid', () => {
        it('should have proper component.', () => {
            const baseGridSpecs = new BaseGridSpecs<MyComponent>();
            baseGridSpecs.runBaseGridTests(component);
            baseGridSpecs.checkGetDataDefined(component);
        });
    });
});

Базовые характеристики:

export class BaseGridSpecs<T> {
  runBaseGridTests(component: any): void {
    expect(component).toBeTruthy();
  }

  checkGetDataDefined(component: any): void {
     expect(component.getData).toBeDefined();
  }
}

Эта структура отлично работает для меня, , но с тех пор она бесполезна мои describe и it все еще находятся в файле основного компонента spe c.

То, чего я пытаюсь добиться, это просто вызвать функцию base spe c, такую ​​как baseGridSpecs.runBaseGridTests(component);, и он должен отображать все спецификации describe и it для данного компонента generi c.

Любая помощь будет очень признателен ...

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Jasmine допускает it определений из describe блоков, и эти определения не будут выполняться, если вы не вызовете их явно из какого-то блока describe. Официальная документация предлагает два способа использования этого факта.

Испытуемый может использоваться совместно с контекстом, но он требует, чтобы вы использовали function вместо функций стрелок, и это может раздражать и затруднять работу особенно отслеживать, когда есть много вложенных блоков, поэтому ваша идея иметь класс для спецификаций имеет смысл.

Давайте рассмотрим упрощенный пример с двумя классами. ( Детская площадка )

// Base.ts  
export class Base {
  baseMethod() {
    return 0;
  }
}

и

// Derived.ts
import { Base } from "./base";

export class Derived extends Base {
  derivedMethod() {
    return 1;
  }
}

Тесты для производного класса, проверяющие части базового класса, могут быть заключены в BaseSpec:

// base.spec.ts
export class BaseSpec {
  public component;

  checkComponentInitialized(): void {
    it("should have proper component", () => {
      expect(this.component).toBeTruthy();
    });
  }

  checkBaseMethodDefined(): void {
    it("should have baseMethod method", () => {
      expect(this.component.baseMethod).toBeDefined();
    });
  }

  itActsLikeABase(): void {
    this.checkComponentInitialized();
    this.checkBaseMethodDefined();
  }
}

Этот класс затем может быть использован в другом месте

// derived.spec.ts
import { Derived } from "./derived";
import { BaseSpec } from "./base.spec";

describe("Derived", () => {
  describe("as a Base", () => {
    const baseSpec = new BaseSpec();

    beforeEach(() => {
      baseSpec.component = new Derived();
    });

    baseSpec.itActsLikeABase();
  });

  describe("as a Derived", () => {
    let component;
    beforeEach(() => {
      component = new Derived();
    });

    it("should have derivedMethod method", () => {
      expect(component.derivedMethod).toBeDefined();
    });
  });
});

Отказ от ответственности

Хотя это технически возможно и может быть целесообразным в некоторых случаях, пожалуйста, дважды подумайте, прежде чем писать тестирует этот путь. Наследование является мощным, но часто неправильно используемым инструментом. Дублирование из-за тестирования общего поведения, скорее всего, является случайным дублированием, поскольку тесты не должны зависеть от того, как реализовано поведение. Предупреждение о тестировании поведения при совместном использовании

0 голосов
/ 12 апреля 2020

Итак, с помощью Shalang, я смог добавить модульные тесты в файл базовой сетки spe c. Вот что я сделал.

Характеристики компонентов:

describe('MyComponent ', () => {
  let component: MyComponent;
  let fixture: ComponentFixture<MyComponent>;

  beforeEach(async(() => {
      TestBed.configureTestingModule({
          declarations: [MyComponent],
          imports: [
              ...
      ],
          providers: [
          ],
      }).compileComponents().then(() => {
          fixture = TestBed.createComponent(MyComponent);
          component = fixture.componentInstance;
      });
  }));

  describe('Should initialize Base grid', () => {
    const baseGridSpecs = new BaseGridSpecs<ComponentModel>();

    beforeEach(() => {
      baseGridSpecs.component = component;
      baseGridSpecs.fixture = fixture;          
    });

    // Here for me dummyData is model's object with proper value, 
    // which I can use to check service based calls.
    baseGridSpecs.loadSpecs(dummyData);
  });
});

Базовые характеристики:

export class BaseGridSpecs<T> {
  public component;

  public fixture;

  loadSpecs(dummyData: any): void {
    describe('Should initialize base component with Proper methods', () => {
      it('should initialize properly.', () => {
        expect(this.component).toBeTruthy();
      });

      it('should have Base getData function defined.', () => {
        expect(this.component.getData).toBeDefined();
      });
    });
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...