Как провести модульное тестирование MatSnackbar с помощью Jasmine Karma в Angular

Я хочу выполнить модульное тестирование этой функции onSubmit, где положительная отправка приводит к MatSnackbar с сообщением «Отправлено успешно». Я новичок в Jasmine Karma, пожалуйста, расскажите мне о тестировании MatSnackbar в этом случае.

Component.ts

import { MatSnackBar } from "@angular/material/snack-bar";

  constructor(
    private snackBar: MatSnackBar,
    private auth: AuthenticateService,

  ) {}
...
...
  onSubmit(e) {
    const newYellow = {
      G1: e.value.Yellow_G1,
      G2: e.value.Yellow_G2,
      G3: e.value.Yellow_G3,
      G4: e.value.Yellow_G4,
      B1: e.value.Yellow_B1,
      B2: e.value.Yellow_B2,
      B3: e.value.Yellow_B3,
      B4: e.value.Yellow_B4,
    };
    console.log(newYellow);
    this.auth.submitnominYellow(newYellow).subscribe(
      (res) => {
        console.log(res);
        this.snackBar.open("Submitted Successfully", "", {
          duration: 2000,
        });
      },
      (error) => {
        console.log(error);
      }
    );
  }

Это код для функции submitnomin. auth.service.ts

submitnominYellow(inpobj) {
    console.log(inpobj);
    return this.http.post(environment.apiUrl + '/api/customize/yellow', inpobj);
}

Мой тестовый пример примерно такой.
component.spec.ts

    const mockSnackbarMock = jasmine.createSpyObj(['open']);
    mockSnackbarMock.open
    
    const mockopblue =
      {
        success: true
    }
    
    const MockAuthService = {
      submitnominYellow:(id) => (mockopblue),
      getuser:() => (undefined)
    
    };
...
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ YellowCustomizeComponent ],
      imports: [HttpClientTestingModule, MatSnackBarModule, FormsModule, RouterTestingModule],
      providers:[{provide: MatSnackBar, useValue: mockSnackbarMock},
      {provide: AuthenticateService, useValue: MockAuthService}
      ]

    })
    .compileComponents();
  }));
...

          fit('should open the snack bar with correct arguments when form submitted', () => {
            const e =  {
              value:{
                Yellow_G1: "YGirlName1",
                Yellow_G2: "GirlName2",
                Yellow_G3: "GirlName3",
                Yellow_G4: "GirlName4",
                Yellow_B1: "BoyName1",
                Yellow_B2: "BoyName2",
                Yellow_B3: "BoyName3",
                Yellow_B4: "BoyName4",
              }
              
            };
            component.onSubmit(e)
            console.log('mockSnackbarMock',mockSnackbarMock)
            // console.log('yellow onsubmit',component.onSubmit(e)); 
            expect(mockSnackbarMock.open).toHaveBeenCalledWith("Submitted Successfully", "", );
         })

person Community    schedule 11.07.2021    source источник
comment
Если вы хотите просто протестировать закусочную, а не весь метод, я бы посоветовал создать mock/stub authService с заглушенным методом submitnominYellow, который вернет успех. Вы захотите использовать обратный вызов теста fakeAsync в тестовом методе «it». Вы можете создать шпиона snackBar и его метода create. Надеюсь это поможет   -  person bjlasc01    schedule 12.07.2021
comment
Спасибо, но закусочная является частью функции, так что я буду делать дальше. Пожалуйста, помогите мне, я новичок в модульном тестировании жасминовой кармы.   -  person    schedule 12.07.2021
comment
Является ли this.snackBar viewChild компонента или что?   -  person bjlasc01    schedule 12.07.2021
comment
Я не понимаю, что ты пытаешься сказать. Пожалуйста, ответьте в виде кода.   -  person    schedule 13.07.2021
comment
` Хитеш Агаше `, не могли бы вы предоставить фрагмент кода, в котором вы объявляете snackBar свойство?   -  person IAfanasov    schedule 19.07.2021
comment
Отредактировано, сэр, пожалуйста, проверьте!   -  person    schedule 19.07.2021
comment
@IAfanasov Нежное напоминание   -  person    schedule 21.07.2021


Ответы (1)


в тесте можно изменить конфигурацию внедрения зависимостей, чтобы вместо экземпляра SnackBar предоставлялся mock. Вот как это сделать:

const mockSnackbarMock = jasmine.createSpyObj(['open']);
mockSnackbarMock.open

await TestBed.configureTestingModule({
            declarations: [
                ...
            ],
            providers: [
                {provide: MatSnackBar, useValue: mockSnackbarMock},
            ],
            imports: [
                ...
            ],
        }).compileComponents();

Позже в тесте, после всех действий, которые запускают закусочную, вы можете проверить, правильно ли был вызван метод open:

it('should open the snack bar with correct arguments when form submitted', () => {
   //emulate submission

   expect(mockSnackbarMock.open).toHaveBeenCalledWith("Submitted Successfully", "", {duration: 2000});
})
person IAfanasov    schedule 21.07.2021
comment
мы можем пообщаться лично? мой код слишком длинный, чтобы комментировать, и я не могу редактировать исходный вопрос. - person ; 21.07.2021
comment
извините, я что-то пропустил. Изменено expect(mockSnackbarMock) на expect(mockSnackbarMock.open) - person IAfanasov; 22.07.2021
comment
и извините, личное общение будет слишком отвлекать - person IAfanasov; 22.07.2021
comment
Вы пропустили часть: after all the actions which trigger the snack bar. Я не знаю, как бы вы предпочли это сделать. Вы можете рассмотреть возможность эмуляции нажатия на кнопку, которая запускает закусочную, или, может быть, просто вызов метода. - person IAfanasov; 22.07.2021
comment
Функция Onsubmit запускает закусочную, и я уже вызываю ее - person ; 22.07.2021
comment
В сообщении об ошибке ожидания указано, что метод snackbar.open не вызывался. Есть ли шанс, что this.auth.submitnominYellow(newYellow) не вернет правильную наблюдаемую в тесте? - person IAfanasov; 23.07.2021
comment
Mock возвращает правильное значение, я проверил. Должен ли я добавить что-то в код модульного теста?? - person ; 25.07.2021
comment
было бы полезно показать код модульного теста (: - person IAfanasov; 25.07.2021
comment
Код модульного теста добавлен в вопрос, пожалуйста, продолжайте. - person ; 25.07.2021
comment
Я вижу макет службы аутентификации const MockAuthService = {submitnominYellow:(id) => ({ success: true })};. С таким макетом при тестовом прогоне кусок this.auth.submitnominYellow(newYellow).subscribe будет равен true и должна появиться ошибка `true is not a function`. что-то не совпадает в этом коде. посмотрите, как правильно настроить макет здесь: stackoverflow.com/a/40240950/390161 - person IAfanasov; 26.07.2021
comment
Ага, submitnominYellow:(id) => of (mockopblue), - person ; 28.07.2021