Ошибка в угловых модульных тестах: Ошибка типа: this.userService.currentUser.subscribe не является функцией - PullRequest
1 голос
/ 05 ноября 2019

Я получаю эту ошибку при выполнении угловых модульных тестов:

Результат теста

SidebarComponent
   × should create
    TypeError: this.userService.currentUser.subscribe is not a function

sidebar.component.spec.ts

describe('SidebarComponent', () => {
  let fixture: ComponentFixture<SidebarComponent>;
  let mockUserService;

  beforeEach(() => {
    mockUserService = jasmine.createSpyObj(['currentUser']);

    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      declarations: [SidebarComponent],
      schemas: [NO_ERRORS_SCHEMA],
      providers: [{ provide: UserService, useValue: mockUserService }]
    });

    fixture = TestBed.createComponent(SidebarComponent);
  });

  fit('should create', () => {
    mockUserService.currentUser.and.returnValue(of('Here goes an object'));
    fixture.detectChanges();
    expect(SidebarComponent).toBeTruthy();
  });
});

sidebar.component.ts

ngOnInit() {
    this.userService.currentUser.subscribe(currentUser => {
        // Some code here
    });
}

package.json

"devDependencies": {
    "@types/jasmine": "2.8.8",
    "@types/jasminewd2": "2.0.3",
    "@types/node": "9.6.23",
    "jasmine-core": "2.99.1",
    "jasmine-spec-reporter": "4.2.1",
    "karma": "4.2.0",
    "karma-chrome-launcher": "2.2.0",
    "karma-cli": "2.0.0",
    "karma-coverage-istanbul-reporter": "1.4.3",
    "karma-jasmine": "2.0.1",
    "karma-jasmine-html-reporter": "1.4.0",
    "karma-junit-reporter": "1.2.0",
    "karma-spec-reporter": "0.0.32",
    "protractor": "6.0.0",
    "rxjs-tslint": "0.1.7",
}

user.service.ts

@Injectable({ providedIn: 'root'})
export class UserService {
  private currentUserSubject = new BehaviorSubject({});
  public currentUser: Observable<User> = this.currentUserSubject.asObservable().pipe(distinctUntilChanged());
}

Насколько мне известно, для решения этого вопроса нам необходимо использовать следующее утверждение:

mockUserService.currentUser.and. returnValue (of ('Здесь идет объект'));

, где of импортируется из 'rxjs'. Когда я записываю значение («Здесь идет объект»), это показывает, что это можно наблюдать.

Как мне решить проблему?

Ответы [ 2 ]

4 голосов
/ 05 ноября 2019

Как насчет использования spyOn, чтобы высмеивать определенный метод обслуживания:

const userService = TestBed.get(UserService);
const mockedResponse = {}; // Modify as per your need
spyOn(userService, 'currentUser').and.callFake(() => {
  return of(mockedResponse);
});

Это сработало для меня.

0 голосов
/ 05 ноября 2019

Вы можете сделать что-то подобное:

export const mockUserService= {
    currentUser = {
        subscribe() {
          return of({ 
              // whatever here
          });
        }
    }
};

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...