首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >你总是需要一个ActivatedRoute的mock吗?

你总是需要一个ActivatedRoute的mock吗?
EN

Stack Overflow用户
提问于 2019-11-10 17:37:56
回答 1查看 39关注 0票数 0

所以我正在做一些单元测试。以及我尝试单元测试的以下组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export class EcheqDisplayComponent implements OnInit {
  echeq: EcheqSubmissionApi;
  orgId = 1;

  constructor(
    private route: ActivatedRoute
  ) {
    this.echeq = this.route.snapshot.data['submission'];
  }

  ngOnInit() {
  }

  getAnswers(page: EcheqPageApi): any[] {
    return page.elements.map(element => this.echeq.answers[element.name]);
  }

这是它的单元测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
describe('EcheqDisplayComponent', () => {
  let component: EcheqDisplayComponent;
  let fixture: ComponentFixture<EcheqDisplayComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ ],
      imports:[ParticipantEcheqModule,
        RouterModule.forRoot([])

      ]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(EcheqDisplayComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

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

所以我不会收到错误。

但我的问题是。这是正确的方法吗?

因为对ActivatedRoute使用模拟不是更好吗?

如果是的话,怎么做才是正确的呢?

谢谢

sO这是它的模板:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="echeq-display" *ngIf="echeq">
  <header class="echeq-display-header header">
    <div class="echeq-display-info">
      <h1 class="heading echeq-display-heading">
        {{ echeq.definition.title }}
      </h1>
      <div class="sub-heading echeq-display-subheading">
        <span class="echeq-display-creator">
          Toegekend door:
          {{ echeq.assignedByProfName ? echeq.assignedByProfName : 'Het Systeem' }}
        </span>
        <span class="echeq-display-date">{{
          echeq.definition.createdOnUtc | date: 'dd MMM'
        }}</span>
      </div>
    </div>
    <app-meta-box
      [metadata]="{
        numPages: echeq.definition.numPages,
        vPoints: echeq.definition.awardedVPoints
      }"
    ></app-meta-box>
  </header>
  <main class="echeq-display-questions body">
    <app-echeq-question
      *ngFor="let page of echeq.definition.pages; let i = index"
      [page]="page"
      [readonly]="true"
      [number]="i + 1"
      [answers]="getAnswers(page)"
    ></app-echeq-question>
  </main>
</div>

单元测试是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ ],
      providers: [
        { provide: ActivatedRoute, useClass: MockActivatedRoute }
      ],
      imports:[
        ParticipantEcheqModule

      ]
    })
    .compileComponents();
  }));

这是app-meta-box组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export class MetaData {
  numPages: number;
  vPoints: number;
}

@Component({
  selector: 'app-meta-box',
  templateUrl: './meta-box.component.html',
  styleUrls: ['./meta-box.component.scss']
})
export class MetaBoxComponent implements OnInit {
  @Input() metadata: MetaData;

  constructor() {}

  ngOnInit() {}

}
EN

回答 1

Stack Overflow用户

发布于 2019-11-10 18:27:12

当调用"TestBed.configureTestingModule({...})“配置测试模块时,您只需在"providers”属性中设置必要的变量,即可提供模拟的ActivatedRoute对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MockActivatedRoute {
    public snapshot = { 
        data: {
           submission: {
             answers: {}
           }
        }
    };
}

TestBed.configureTestingModule({
  declarations: [ ],
  providers: [
   { provide: ActivatedRoute, useClass: MockActivatedRoute }
  ]
  imports:[
    ParticipantEcheqModule,
    // RouterModule.forRoot([]) // Not required after mocking the "ActivatedRoute"
  ]
})
.compileComponents();

这样,您就可以在activatedRoute中测试组件的不同值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58791259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文