Шпионить за одной и той же функцией несколько раз с разными параметрами в тесте Angular

#angular #angular-test

#угловатый #angular-тест

Вопрос:

Есть ли какой-либо способ вызвать функцию вызова два раза с разными аргументами.Я использую приведенный ниже код

Есть два аргумента, как показано ниже

 let dummybody1: any = {
    Product : "New Product",
   
  };
  let dummybody2: any = {
    Product : "New Node",
    
  };
 

Редактировать 1

component.ts

 addDetailsClick(): void {
let body: any = {
      Product : this.actualselectedprod,
      
    }
    if(this.actualselectedprod == "New Product")
    {
      body.Product = this.newProductName; 
      body.HealthURL = this.healthEndPoint;
    }
    if(this.actualselectedipAddress == "New Node")
    {
      body.Ipaddress = this.newIPAddress;
    }
    let obs = this.cmnService.addEditNodeDetails(body);

    obs.subscribe(data => {
      console.log('success', data)

      this.addNodeMessage = "Successfully Added/Edited Node details";
    },
      error => {
        console.log('oops', error)

        this.addNodeMessage = "Failed to Add/Edit Node details";
      })

    
  }
}
 

component.spec.ts

     beforeEach(() => {
    
    spyOn(service,'addDetails').and.callFake(function(dummybody1) {
          
          return of('success')     
    
        });
    
    }

it('should be able to click add/new button', () => {
    result = component.addNewNodeButtonClick();
    service.addDetailsClick(dummybody1);
    //service.addEditNodeDetails(dummybody2);
    expect(component.addNodeMessage).toEqual("Successfully Added/Edited Node details");
    });
 

Я пытаюсь написать тест для метода addDetailsClick() с аргументом как dummybody1.

Пытался добавить другой шпионский метод внутри beforeEach для dummybody2

 beforeEach(() => {
        
        spyOn(service,'addDetails').and.callFake(function(dummybody1) {
              
              return of('success')     
        
            });
        
       spyOn(service,'addDetails').and.callFake(function(dummybody) {
              
              return of('success')     
        
            });
        
}
 

получение ошибки

Как я могу сделать аналогичный метод с аргументом `dummybody2.

Комментарии:

1. Вопрос меня смущает. Вы здесь ничего не вызываете, кроме определения обратного вызова, который addDetails перенаправляет на вместо того, что он делает по умолчанию. .and.callFake определяет вызываемую функцию, на самом деле она ее не вызывает. Если вы хотите вызвать .addDetails service вас, просто сделайте services.addDetails(...) , как обычно

2. обновлен вопрос -McAden

Ответ №1:

Я полагаю, что вы думаете об этом с неправильного направления. Я вижу 2 проблемы:

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

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

 spyOn(service,'addDetails').and.callFake(function(dummybody) {
  return of('success')     
});
 

Это вызовет эту подделку для всего, что входит в addDetails — dummybody в данном случае является объявлением переменной и станет тем, с чем вы вызываете service.addDetails(...) .

  1. Из предоставленного кода ваш код вызывает addEditNodeDetails , но вы издеваетесь addDetails .