forked from help-me-mom/ng-mocks
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(core): hidden usage of MockBuilder in TestBed if kept and mock m…
…odules are used together help-me-mom#4344
- Loading branch information
Showing
12 changed files
with
253 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
import { | ||
CdkFixedSizeVirtualScroll, | ||
ScrollingModule, | ||
} from '@angular/cdk/scrolling'; | ||
import { Component, NgModule } from '@angular/core'; | ||
import { TestBed } from '@angular/core/testing'; | ||
import { | ||
MockBuilder, | ||
MockModule, | ||
MockRender, | ||
ngMocks, | ||
} from 'ng-mocks'; | ||
|
||
@Component({ | ||
selector: 'dependency', | ||
template: | ||
'<cdk-virtual-scroll-viewport [itemSize]="15"></cdk-virtual-scroll-viewport>', | ||
}) | ||
class DependencyComponent {} | ||
|
||
@NgModule({ | ||
imports: [ScrollingModule], | ||
declarations: [DependencyComponent], | ||
exports: [DependencyComponent, ScrollingModule], | ||
}) | ||
class DependencyModule {} | ||
|
||
@Component({ | ||
selector: 'target', | ||
template: | ||
'<dependency></dependency><cdk-virtual-scroll-viewport [itemSize]="15"></cdk-virtual-scroll-viewport>', | ||
}) | ||
class TargetComponent {} | ||
|
||
@NgModule({ | ||
imports: [DependencyModule], | ||
declarations: [TargetComponent], | ||
exports: [TargetComponent], | ||
}) | ||
class TargetModule {} | ||
|
||
// @see https://github.com/help-me-mom/ng-mocks/issues/4344 | ||
// Type CdkFixedSizeVirtualScroll is part of the declarations of 2 modules: | ||
// MockOfScrollingModule and ScrollingModule! | ||
// Please consider moving CdkFixedSizeVirtualScroll to a higher module | ||
// that imports MockOfScrollingModule and ScrollingModule. | ||
describe('issue-4344', () => { | ||
beforeAll(() => ngMocks.globalKeep(CdkFixedSizeVirtualScroll)); | ||
afterAll(() => ngMocks.globalWipe(CdkFixedSizeVirtualScroll)); | ||
|
||
describe('TestBed', () => { | ||
beforeEach(() => | ||
TestBed.configureTestingModule({ | ||
imports: [MockModule(DependencyModule), TargetModule], | ||
}).compileComponents(), | ||
); | ||
|
||
it('creates TargetComponent', () => { | ||
expect(() => MockRender(TargetComponent)).not.toThrow(); | ||
}); | ||
}); | ||
|
||
describe('MockBuilder', () => { | ||
beforeEach(() => MockBuilder(TargetModule, DependencyModule)); | ||
|
||
it('creates TargetComponent', () => { | ||
expect(() => MockRender(TargetComponent)).not.toThrow(); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
import { | ||
AsyncPipe, | ||
CommonModule, | ||
DecimalPipe, | ||
} from '@angular/common'; | ||
import { | ||
Component, | ||
Injectable, | ||
NgModule, | ||
VERSION, | ||
} from '@angular/core'; | ||
import { TestBed } from '@angular/core/testing'; | ||
|
||
import { | ||
isMockOf, | ||
MockComponent, | ||
MockModule, | ||
MockRender, | ||
ngMocks, | ||
} from 'ng-mocks'; | ||
|
||
@Injectable() | ||
class TargetService {} | ||
|
||
@Component({ | ||
selector: 'target', | ||
template: '{{ 1 | number }}', | ||
}) | ||
class TargetComponent { | ||
constructor( | ||
public readonly service: TargetService, | ||
public readonly pipe: AsyncPipe, | ||
) {} | ||
} | ||
@NgModule({ | ||
declarations: [TargetComponent], | ||
imports: [CommonModule], | ||
exports: [CommonModule, TargetComponent], | ||
providers: [TargetService, AsyncPipe], | ||
}) | ||
class TargetModule {} | ||
|
||
@Component( | ||
{ | ||
selector: 'standalone', | ||
template: '{{ 1 | number }}', | ||
standalone: true, | ||
imports: [TargetModule], | ||
providers: [AsyncPipe], | ||
} as never /* TODO: remove after upgrade to a14 */, | ||
) | ||
class StandaloneComponent { | ||
constructor( | ||
public readonly service: TargetService, | ||
public readonly pipe: AsyncPipe, | ||
) {} | ||
} | ||
|
||
ngMocks.globalKeep(TargetComponent); | ||
ngMocks.globalMock(TargetModule); | ||
|
||
// @see https://github.com/help-me-mom/ng-mocks/issues/4344 | ||
// exporting AsyncPipe from CommonModule which is kept, | ||
// causes an issue, because ng-mocks mocks AsyncPipe, whereas it shouldn't. | ||
// That happens because a previously checked CommonModule doesn't expose its guts anymore. | ||
describe('issue-4344:standalone:explicit', () => { | ||
if (Number.parseInt(VERSION.major, 10) < 14) { | ||
it('needs >=a14', () => { | ||
expect(true).toBeTruthy(); | ||
}); | ||
|
||
return; | ||
} | ||
|
||
beforeEach(async () => { | ||
await TestBed.configureTestingModule({ | ||
imports: [ | ||
MockModule(CommonModule), | ||
MockComponent(StandaloneComponent), | ||
MockModule(TargetModule), | ||
], | ||
}).compileComponents(); | ||
}); | ||
|
||
it('creates StandaloneComponent', () => { | ||
expect(() => MockRender(StandaloneComponent)).not.toThrow(); | ||
|
||
const targetService = ngMocks.findInstance(TargetService); | ||
expect(isMockOf(targetService, TargetService)).toEqual(true); | ||
|
||
const asyncPipe = ngMocks.findInstance(AsyncPipe); | ||
expect(isMockOf(asyncPipe, AsyncPipe)).toEqual(false); | ||
}); | ||
|
||
it('creates TargetComponent', () => { | ||
expect(() => MockRender(TargetComponent)).not.toThrow(); | ||
|
||
const decimalPipe = ngMocks.findInstance(DecimalPipe); | ||
expect(isMockOf(decimalPipe, DecimalPipe)).toEqual(false); | ||
|
||
const targetService = ngMocks.findInstance(TargetService); | ||
expect(isMockOf(targetService, TargetService)).toEqual(true); | ||
|
||
const asyncPipe = ngMocks.findInstance(AsyncPipe); | ||
expect(isMockOf(asyncPipe, AsyncPipe)).toEqual(false); | ||
}); | ||
}); |