diff --git a/e2e/normal-usage-after-mock-builder/fixtures.components.ts b/e2e/normal-usage-after-mock-builder/fixtures.components.ts
new file mode 100644
index 0000000000..66c5fbe6df
--- /dev/null
+++ b/e2e/normal-usage-after-mock-builder/fixtures.components.ts
@@ -0,0 +1,30 @@
+// tslint:disable:max-classes-per-file
+
+import { Component } from '@angular/core';
+import { TargetService } from './fixtures.services';
+
+@Component({
+ selector: 'root',
+ template: '{{ service.called }}',
+})
+export class TargetComponent {
+ public readonly service: TargetService;
+
+ constructor(service: TargetService) {
+ this.service = service;
+ }
+}
+
+@Component({
+ selector: 'internal',
+ template: 'real',
+})
+export class RealComponent {
+}
+
+@Component({
+ selector: 'internal',
+ template: 'fake',
+})
+export class FakeComponent {
+}
diff --git a/e2e/normal-usage-after-mock-builder/fixtures.modules.ts b/e2e/normal-usage-after-mock-builder/fixtures.modules.ts
new file mode 100644
index 0000000000..82ecb9f94e
--- /dev/null
+++ b/e2e/normal-usage-after-mock-builder/fixtures.modules.ts
@@ -0,0 +1,27 @@
+// tslint:disable:max-classes-per-file
+
+import { NgModule } from '@angular/core';
+
+import { RealComponent, TargetComponent } from './fixtures.components';
+import { TargetService } from './fixtures.services';
+
+@NgModule({
+ declarations: [
+ TargetComponent,
+ RealComponent,
+ ],
+ exports: [
+ TargetComponent,
+ ],
+ providers: [
+ TargetService,
+ ],
+})
+export class TargetModule {
+ protected service: TargetService;
+
+ constructor(service: TargetService) {
+ this.service = service;
+ this.service.call();
+ }
+}
diff --git a/e2e/normal-usage-after-mock-builder/fixtures.services.ts b/e2e/normal-usage-after-mock-builder/fixtures.services.ts
new file mode 100644
index 0000000000..318ed1ec2e
--- /dev/null
+++ b/e2e/normal-usage-after-mock-builder/fixtures.services.ts
@@ -0,0 +1,12 @@
+// tslint:disable:max-classes-per-file
+
+import { Injectable } from '@angular/core';
+
+@Injectable()
+export class TargetService {
+ public called = 0;
+
+ public call(): void {
+ this.called += 1;
+ }
+}
diff --git a/e2e/normal-usage-after-mock-builder/test.spec.ts b/e2e/normal-usage-after-mock-builder/test.spec.ts
new file mode 100644
index 0000000000..d38a74f8b1
--- /dev/null
+++ b/e2e/normal-usage-after-mock-builder/test.spec.ts
@@ -0,0 +1,41 @@
+import { TestBed } from '@angular/core/testing';
+import { MockBuilder, MockRender } from 'ng-mocks';
+
+import { FakeComponent, RealComponent, TargetComponent } from './fixtures.components';
+import { TargetModule } from './fixtures.modules';
+
+describe('normal-usage-after-mock-builder:real1', () => {
+ beforeEach(() => TestBed.configureTestingModule({
+ imports: [TargetModule],
+ }).compileComponents());
+
+ it('renders real component because we did not use MockBuilder.replace yet', () => {
+ const fixture = MockRender(TargetComponent);
+ expect(fixture.debugElement.nativeElement.innerHTML).toEqual('real1');
+ });
+});
+
+describe('normal-usage-after-mock-builder:mock', () => {
+ beforeEach(() => TestBed.configureTestingModule(
+ MockBuilder()
+ .keep(TargetModule)
+ .replace(RealComponent, FakeComponent, {dependency: true})
+ .build()
+ ).compileComponents());
+
+ it('renders fake component because we used MockBuilder.replace', () => {
+ const fixture = MockRender(TargetComponent);
+ expect(fixture.debugElement.nativeElement.innerHTML).toEqual('fake1');
+ });
+});
+
+describe('normal-usage-after-mock-builder:real2', () => {
+ beforeEach(() => TestBed.configureTestingModule({
+ imports: [TargetModule],
+ }).compileComponents());
+
+ it('has to render real component after MockBuilder.replace', () => {
+ const fixture = MockRender(TargetComponent);
+ expect(fixture.debugElement.nativeElement.innerHTML).toEqual('real1');
+ });
+});
diff --git a/lib/mock-module/mock-module.ts b/lib/mock-module/mock-module.ts
index f467478218..3f192e7f87 100644
--- a/lib/mock-module/mock-module.ts
+++ b/lib/mock-module/mock-module.ts
@@ -119,9 +119,11 @@ export function MockModule(module: any): any { // tslint:disable-line:cyclomatic
}
if (mockModuleDef) {
+ const parent = ngMocksUniverse.flags.has('skipMock') ? ngModule : Mock;
+
@NgModule(mockModuleDef)
@MockOf(ngModule)
- class ModuleMock extends Mock {
+ class ModuleMock extends parent {
}
mockModule = ModuleMock;