Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 订阅服务单元测试中的模拟变量_Javascript_Angular_Unit Testing_Service_Karma Jasmine - Fatal编程技术网

Javascript 订阅服务单元测试中的模拟变量

Javascript 订阅服务单元测试中的模拟变量,javascript,angular,unit-testing,service,karma-jasmine,Javascript,Angular,Unit Testing,Service,Karma Jasmine,我试图对订阅数据服务变量的组件进行单元测试。我试图模拟服务并覆盖组件的私有数据服务变量,但我不确定如何测试模拟变量的订阅。以下是我的(有限)代码: 服务: export class Service { constructor(private dataService: DataService) { this.dataService.newData.subscribe(data => { //do something }); } } 数据服务: expor

我试图对订阅数据服务变量的组件进行单元测试。我试图模拟服务并覆盖组件的私有数据服务变量,但我不确定如何测试模拟变量的订阅。以下是我的(有限)代码:

服务:

export class Service {
  constructor(private dataService: DataService) {
    this.dataService.newData.subscribe(data => {
      //do something
    });
  }
}
数据服务:

export class DataService {
  private source = new BehaviorSubject<any>([]);
  newData = this.source.asObservable();

  //code to update source
}
导出类数据服务{
私有源=新行为主体([]);
newData=this.source.asObservable();
//更新源代码
}
服务单元测试:

mockDataService {
  private source = new BehaviorSubject<any>([]);
  newData = this.source.asObservable();
}

describe('Service', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        Service,
        {provide: DataService, useClass: mockDataService} // is this correct?
      ]
    }).overrideComponent(Service, {
      set: {
        providers: [
          {provide: DataService, useClass: mockDataService}
        ]
      }
    }).compileComponents();
  });

  it('should register subscription', inject([Service, DataService], (service: ServiceA, mock: DataService) => { //should I be injecting the mock class?
    expect(before()).toBeTruthy();
    mock.newData.next("test"); // what's the correct way to test?
    expect(after()).toBeTruthy();
  }));
}
mockDataService{
私有源=新行为主体([]);
newData=this.source.asObservable();
}
描述('服务',()=>{
在每个之前(()=>{
TestBed.configureTestingModule({
供应商:[
服务
{provide:DataService,useClass:mockDataService}//这是否正确?
]
}).overrideComponent(服务、{
设置:{
供应商:[
{提供:数据服务,useClass:mockDataService}
]
}
}).compileComponents();
});
它('should register subscription',injection([Service,DataService],(Service:ServiceA,mock:DataService)=>{//我应该注入mock类吗?
expect(before()).toBeTruthy();
mock.newData.next(“test”);//正确的测试方法是什么?
expect(after()).toBeTruthy();
}));
}
我是否正确地重写了?如果是,我如何正确地测试我的组件在订阅私有服务的变量时是否执行了正确的操作


谢谢!

首先,如果您可以在类旁边提供注释,这将很有帮助。我假设
服务
类是一个组件,因为您在调用
TestBed.overrideComponent
时引用了它。在这种情况下,命名会比较混乱。它至少应该有一个后缀“component”(请参阅)

如果
Service
实际上应该是一个服务类,那么将服务嵌套到另一个服务类中可能不是一个好做法(.)


你基本上要求两件事

1.是否需要通过
TestBed.configureTestingModule
覆盖模块的
提供程序
属性? 对于上面的示例,这是不必要的。您可以很容易地从对象中忽略providers属性。它将如下所示

TestBed.configureTestingModule({})
在某些情况下,可能需要更改提供程序,但在您的情况下不是这样

2.如何正确测试服务? 您似乎将集成测试与单元测试混为一谈。您希望以两种方式测试服务

第一:对服务进行单元测试()

第二:集成测试——您在这里似乎在做什么。在文档()中有一个推荐的最佳实践:

关于
mock.newData.next(“test”)
,现在还不清楚您在这里试图实现什么。此方法调用可能会给您一个
未定义的函数测试
错误。为什么?您指的是
This.source.asObservable()
返回。此对象没有
next
方法。您可能应该在RxJs上做一些基本教程

希望这有帮助

最好的, 本吉

it('should register subscription', () => {
    const fixture = TestBed.createComponent(Service);
    dataService = fixture.debugElement.injector.get(DataService);
    // do things
});