Я исправил эту проблему, переопределив модуль, содержащий компонент ngx-recaptcha2.
MockComponent для Recaptcha V2
import { Component, Input, forwardRef } from "@angular/core";
import { NG_VALUE_ACCESSOR } from "@angular/forms";
import { MockControlValueAccessor } from "./control_value_accessor.mock";
@Component({
// tslint:disable-next-line:component-selector
selector: "ngx-recaptcha2",
template: "<div></div>",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => MockRecaptchaV2Component),
multi: true
},
]
})
export class MockRecaptchaV2Component extends MockControlValueAccessor {
@Input() siteKey: string;
}
<ngx-recaptcha2 #captchaElem [siteKey]="captchaSiteKey" formControlName="captcha"></ngx-recaptcha2>
Recaptcha использует formControlName, поэтому нам нужен следующий фиктивный класс.
import { ControlValueAccessor } from "@angular/forms";
export class MockControlValueAccessor implements ControlValueAccessor {
writeValue(obj: any): void {
}
registerOnChange(fn: any): void {
}
registerOnTouched(fn: any): void {
}
setDisabledState?(isDisabled: boolean): void {
}
}
Теперь нам нужно переопределить модуль NgxCaptchaModule, используя следующий код.
beforeEach(async(function () {
TestBed.configureTestingModule({
imports: [BrowserAnimationsModule, ReactiveFormsModule, NgxCaptchaModule],
declarations: [SignupComponent, MockRecaptchaV2Component],
}).overrideModule(NgxCaptchaModule, {
remove: {
// SignupComponent is needed as ReCaptcha2Component is used as child component inside SignupComponent
declarations: [SignupComponent, ReCaptcha2Component],
exports: [SignupComponent, ReCaptcha2Component]
}
}).compileComponents();
}));