Home > Mobile >  How can I test scss subclasses in Angular?
How can I test scss subclasses in Angular?

Time:10-19

I want to test the different background colors for several environments. You can switch between the environments bmw, audi and vw. Depending on the chosen environment the background color will change. Now I want to write an Angular test for this. How can I change the dynamic css class and test it. Please the my code below.

Thank you.

content of component.html

<span >Welcome</span>

content of component.scss

 .car-models {
    &.bmw{
      background: blue;
    }
    &.audi {
      background: yellow;
    }
    &.vw {
      background: black;
    }
}

content of component.spec.ts

    beforeEach(() => {
    fixture = TestBed.createComponent(MyComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });

  it('check background color', () => {
    //if <span >Welcome</span>
    // than should the backgroundcolor of the text blue;
    // if <span >Welcome</span> 
    // than should the background color of the text yellow

  });

CodePudding user response:

Here you go

it('should have yellow background color for audi', () => {
  //(1) Set the value
  component.car = 'audi';
  //(2) Invoke this to update the template
  fixture.detectChanges();

  //(3) Get your element
  const span: HTMLElement = fixture.nativeElement.querySelector('.car-models');
  //(4) Get backgroundColor for above element
  const bgColor = getComputedStyle(span).backgroundColor;

  //(5) Assert it
  expect(colorsMap[bgColor]).toBe('yellow');
});

In the (5) step I used colorsMap to get color name because getComputedStyle returns backgroundColor as rgb value, but we need color name instead

Here is the definition of colorsMap, add it directly inside describe function

const colorsMap: { [key: string]: string } = {
    'rgb(0, 0, 255)': 'blue',
    'rgb(255, 255, 0)': 'yellow',
    'rgb(0, 0, 0)': 'black'
  }

If you didn't like the colorsMap then you have to change your scss color names to rgb

Bonus Tips

Tip 1 - Use By.css instead of querySelector Why? Read Here
// Change this
const span: HTMLElement = fixture.nativeElement.querySelector('.car-models');
// To this
const span: HTMLElement = fixture.debugElement.query(By.css('.car-models')).nativeElement;
Tip 2 - Query element using data-test or data-test-id because CSS classes may get changed in future and your test will fail
<span data-test="carModel" >Welcome</span>
const span: HTMLElement = fixture.debugElement.query(By.css('[data-test="carModel"]')).nativeElement;

CodePudding user response:

thanks you for your solution. I tried it and noticed that the car is read-only (function). So I can not set the "compotent.car" in my test case. What is the best way to set the "car". Writing an setter function or manupulating the appconfig?

export class MyComponent implements OnInit {
  browserVersion = 'N/A';
  hostName = 'N/A';

  constructor(
    @Inject(APP_VERSION)
    public appConfig: { car?: string; appVersion?: string }
  ) {}

  get car(): string | undefined {
    return this.appConfig.car?.toLocaleLowerCase();
  }

PS: I am going to test the tip 2. Thanks for that.

Best regards

  • Related