无法解析AddPassModal的所有参数:(?,?)

时间:2019-04-26 14:19:28

标签: angular testing

我遇到了错误 无法解析AddPassModal的所有参数:(?,?)。

我已经尝试过一些在堆栈溢出中发现的解决方案,但是似乎都没有用。 这是用于添加基于ng2-semantic-ui Component的 https://edcarroll.github.io/ng2-semantic-ui/#/modules/modal

我可以使代码正常工作。但是他在使用辅助类时测试失败。

这是ts文件中的代码

export class PassesComponent implements OnInit {
    constructor(public modal:SuiModal<IAddPassModalContext, void, void>,
        public gu:GetUsersService, public formatDate:DateService, public policyService:PolicyService) {
  }
}

export class AddPassModal extends ComponentModalConfig<IAddPassModalContext, void, void> {
    constructor(title:string, question:string) {
        super(PassesComponent, { title, question });

        this.isClosable = false;
        this.transitionDuration = 200;
        this.size = size;
    }
}

这是给我一个错误的测试文件 无法解析AddPassModal的所有参数:(?,?)。

interface IAddPassModalContext {
  title:string;
  question:string;
}


beforeEach(async(() => {
    TestBed.configureTestingModule({ 
      imports: [
        HttpClientModule,
        FormsModule,
        ReactiveFormsModule,
        SuiModule       
      ],
      declarations: [ PassesComponent ,
        GuestComponent],
      schemas: [CUSTOM_ELEMENTS_SCHEMA],
      providers: [AddPassModal]
    })
    .compileComponents();
  }));

beforeEach(() => {
    fixture = TestBed.createComponent(PassesComponent);
    component = fixture.componentInstance;
    //mocAdd = new MocAddPassModal("test","test",ModalSize.Small);
    fixture.detectChanges();
  });

在GH上的一些示例中,我已经尝试过了。

interface IAddPassModalContext {
  title:string;
  question:string;
}


class MocAddPassModal extends ComponentModalConfig<IAddPassModalContext, void, void> {
    constructor(title:string = "", question:string = "") {
        super(PassesComponent, { title, question });
    }
}



describe('PassesComponent', () => {
  let component: PassesComponent;
  let fixture: ComponentFixture<PassesComponent>;
  let mocAdd: MocAddPassModal = new MocAddPassModal("test","test");


  beforeEach(async(() => {
    TestBed.configureTestingModule({ 
      imports: [
        HttpClientModule,
        FormsModule,
        ReactiveFormsModule,
        SuiModule       
      ],
      declarations: [ PassesComponent ,
        GuestComponent],
      schemas: [CUSTOM_ELEMENTS_SCHEMA],
      providers: [AddPassModal, { provide: PassesComponent, useObject:mocAdd}]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(PassesComponent);
    component = fixture.componentInstance;
    mocAdd = new MocAddPassModal("test","test");
    fixture.detectChanges();
  });

   afterEach(() => {
    mocAdd = null;
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});

不起作用。 请帮忙。 谢谢

2 个答案:

答案 0 :(得分:0)

在您的TestBed中,您将提供“ AddPassModal”,但是TestBed不知道如何构造它,因为它的构造参数是(字符串,字符串,ModalSize)。没有提供任何内容或未分配注入令牌。如果要通过DI构造AddPassModal,则可能需要研究类似this的东西。

您可能只想在测试中提供AddPassModal服务的实例:

providers: [ {provide: AddPassModal, useObject:new MocAddPassModal("test","test",ModalSize.Small)}]

答案 1 :(得分:0)

向@PeterB大声喊叫。他让我走了正确的路。

所以这可能会帮助其他人。 1st我添加了几个Mocs

class MocAddPassModal extends ComponentModalConfig<IAddPassModalContext, void, void> {
    constructor(title:string = "", question:string = "") {
        super(PassesComponent, { title, question });
    }
}
class MocSuiModal{ 
    constructor(title:string = "", question:string = "") {

    }
}

第二次,我像这样添加了提供商

 providers: [{ provide: SuiModal, useObject:new MocSuiModal("test","test")},
      { provide: AddPassModal, useObject:new MocAddPassModal("test","test")}]

比起我得到一个上下文为空的错误,因为componet.modal(modal)为空 要解决我的问题

fixture = TestBed.createComponent(PassesComponent);
    component = fixture.componentInstance;
    component.modal = new SuiModal<IAddPassModalContext, void, void>(new ModalControls(undefined,undefined),contextAddPass);
    fixture.detectChanges();

它有效。 现在只需要使我的测试达到70%,每个人都会很高兴。