【问题标题】:What's the difference between TestBed.get and new Service(...dependencies)TestBed.get 和 new Service(...dependencies) 有什么区别
【发布时间】:2019-11-08 14:26:41
【问题描述】:
angular guide 演示了两种不同的测试方式,一种是调用 new Service() 并直接向构造函数提供依赖项,另一种是通过调用 TestBed.get(Service) 使用依赖注入。
这两者在功能上似乎与我相同,除了当我连续调用 TestBed.get() 时,它不会在第一次调用后调用构造函数。
angular documentation 还提到 TestBed.get() 已被弃用(即使指南仍然引用它!),我应该改用 Type 或 InjectionToken,但我看不出其中任何一个如何类可以替换 TestBed.get()。
【问题讨论】:
标签:
angular
typescript
testing
jasmine
【解决方案2】:
Deprecated from v9.0.0 use TestBed.inject
get(token: any, notFoundValue?: any): any
看看我们现在如何注入:
describe('MyAmountComponent', () => {
let component: MyAmountComponent;
let fixture: ComponentFixture<MyAmountComponent>;
let productService: ProductService;
let orderService: OrderService;
beforeEach(() => {
TestBed.configureTestingModule({
.....
})
.compileComponents();
productService = TestBed.inject(ProductService);
orderService = TestBed.inject(OrderService);
});
添加so可能会对某人有所帮助。
【解决方案3】:
get 已弃用:从 v9.0.0 开始使用 TestBed.inject(弃用)
let valueServiceSpy: jasmine.SpyObj<ValueService>;
beforeEach(() => {
const spy = jasmine.createSpyObj('ValueService', ['getValue']);
TestBed.configureTestingModule({
providers: [
{ provide: ValueService, useValue: spy }
]
});
// This is new way to inject Spied Service
valueServiceSpy = TestBed.inject(ValueService) as jasmine.SpyObj<ValueService>;
});
然后在测试中
it('#getValue should return stubbed value from a spy', () => {
valueServiceSpy.getValue.and.returnValue(yourValue);
...
});
官方文档:https://v9.angular.io/guide/testing#angular-testbed