Skip to content

Commit 54d2853

Browse files
fix: possibility to override global services in Angular component tests (#24394)
* fix: allow to override global services in Angular component tests * move DI tests into their own context * exclude `componentProviders` when a component is mounted with a template * - revert and remove `componentProviders` - run `eslint --fix` on `mount.cy.ts` - add tests that use `TestBed.inject` Co-authored-by: Zachary Williams <ZachJW34@gmail.com>
1 parent 58e0ab9 commit 54d2853

File tree

5 files changed

+285
-140
lines changed

5 files changed

+285
-140
lines changed

npm/angular/src/mount.ts

+1-11
Original file line numberDiff line numberDiff line change
@@ -163,22 +163,12 @@ function initTestBed<T> (
163163
component: Type<T> | string,
164164
config: MountConfig<T>,
165165
): Type<T> {
166-
const { providers, ...configRest } = config
167-
168166
const componentFixture = createComponentFixture(component) as Type<T>
169167

170168
getTestBed().configureTestingModule({
171-
...bootstrapModule(componentFixture, configRest),
169+
...bootstrapModule(componentFixture, config),
172170
})
173171

174-
if (providers != null) {
175-
getTestBed().overrideComponent(componentFixture, {
176-
add: {
177-
providers,
178-
},
179-
})
180-
}
181-
182172
return componentFixture
183173
}
184174

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Component, Injectable } from '@angular/core'
2+
3+
@Injectable({ providedIn: 'root' })
4+
export class Cart {
5+
#items: string[] = []
6+
7+
add (product: string) {
8+
this.#items.push(product)
9+
}
10+
11+
getItems () {
12+
return this.#items
13+
}
14+
}
15+
16+
@Component({
17+
template: `<div><h2>Great Product</h2><button (click)="buy()" data-testid="btn-buy">Buy</button></div>`,
18+
})
19+
export class ProductComponent {
20+
constructor (private cart: Cart) {
21+
}
22+
23+
buy () {
24+
this.cart.add('Great Product')
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { Component, Injectable } from '@angular/core'
2+
3+
@Injectable({ providedIn: 'root' })
4+
export class MessageService {
5+
get message () {
6+
return 'globally provided service'
7+
}
8+
}
9+
10+
@Component({
11+
template: `<p>{{messageService.message}}</p>`,
12+
providers: [{
13+
provide: MessageService,
14+
useValue: { message: 'component provided service' },
15+
}],
16+
})
17+
export class ComponentProviderComponent {
18+
constructor (public messageService: MessageService) {
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { Component, Injectable } from '@angular/core'
2+
3+
@Injectable({ providedIn: 'root' })
4+
export class TransientService {
5+
get message () {
6+
return 'Original Transient Service'
7+
}
8+
}
9+
10+
@Injectable({ providedIn: 'root' })
11+
class DirectService {
12+
constructor (private transientService: TransientService) {
13+
}
14+
15+
get message () {
16+
return this.transientService.message
17+
}
18+
}
19+
20+
@Component({
21+
template: `<p>{{directService.message}}</p>`,
22+
})
23+
export class TransientServicesComponent {
24+
constructor (public directService: DirectService) {}
25+
}

0 commit comments

Comments
 (0)