提供:' root'自动声明服务以进行测试

时间:2018-06-12 13:12:02

标签: angular

可能是这个新功能的副作用,但如果我有一个服务

@Injectable({
  providedIn: 'root'
})
export class MyService {...}

我有MyComponent使用它。现在,当我对该组件进行测试时,我只是这样做而且它有效!

TestBed.configureTestingModule({
  declarations: [ MyComponent ]
})
.compileComponents();

这意味着我提供了隐式服务。我认为这是非常危险的测试行为。是否可以阻止此自动提供?

4 个答案:

答案 0 :(得分:0)

我遇到了这个问题,并做了一些研究。文章的简短答案:

  

providedIn中注册的所有服务都没有加载到测试中,它们只有在确实需要时才被延迟实例化。

参考:https://blog.ninja-squad.com/2018/05/04/what-is-new-angular-6/

答案 1 :(得分:-1)

使用旧语法:

@Injectable()
export class MyService {...}

并将服务注入根模块或相应模块的providers数组中。

如果您使用此方法,您将无法使用新功能:树木可移动的提供商。

答案 2 :(得分:-1)

在您的情况下使用Testbed.overrideProvider

/* Tomcat Dark Theme - Jerome E. Carter, II - Datatribe Softwers, Ltd. cc 2018 */

body, table
{
  background-color: #555555!important;
}

button, input
{
  background-color: #333333!important;
  border: 1px solid white!important;
  border-radius: 5px;
  color: #ffaa00;
}

/*not working as intended - hope to improve later*/
input[type=button]:hover
{
  background-color: #777777;
}

td
{
  background-color: #777777!important;
}

*
{
  color: white;
}

a
{
  color: #ffaa00;
}

tr:hover
{
  border-color: #aaaaaa!important;
}

答案 3 :(得分:-2)

这是按预期工作的,因为您启动了根服务范围(应用程序范围)。如果您不想这样,您仍然可以在组件级别启动它,如:

@Component({
  selector: 'app-villains-list',
  templateUrl: './villains-list.component.html',
  providers: [ MyService ]
})

此方法要求您从服务中删除providedIn标志,如Pavan Shukla所说。

第二种可能性是在模块范围内设置范围,如下所示:

@Injectable({
  providedIn: MyModule,
})

了解更多信息,请阅读: https://angular.io/guide/hierarchical-dependency-injection

干杯