angular - Angular 单元测试用例中出现错误 : TypeError: this. userService.currentUser.subscribe 不是函数

标签 angular jasmine karma-jasmine angular-test

我在运行 Angular 单元测试用例时收到此错误:

测试结果

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());

  setUser(user) {
      this.currentUserSubject.next({ ...newUser });
  }
}

据我所知,要解决这个问题,我们需要在以下语句中使用:

mockUserService.currentUser.and.returnValue(of('Here goes an object'));

其中 of 是从 'rxjs' 导入的。当我记录 of('Here gone an object') 的值时,它表明它是可观察的。

如何解决该问题?

最佳答案

使用 spyOn 来模拟特定的服务方法怎么样:

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

这对我有用。

关于angular - Angular 单元测试用例中出现错误 : TypeError: this. userService.currentUser.subscribe 不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58706340/

相关文章:

angular - 在构建 'Cannot find name ' 排除后出现 lodash 错误''

javascript - 在初始化时将所有过滤器选项设置为 'active' - Angular

angularjs - Jasmine 打印 getText 输出外部函数

javascript - Jasmine 未捕获 Try/Catch 中的错误

angular - 等待 ngOnInit 在 Jasmine Angular2 中完成

javascript - 如何对列表的元素进行分组以形成一个新的列表

html - 无法解决angular4和html中的文本溢出

javascript - Jasmine 2.0 async beforeEach 不等待异步完成

angular - 如何模拟 History.state 以在 Angular 中编写单元测试

javascript - 为什么在 karma 和 jasmine 中运行测试时 fs.readFile 不是一个函数?