首页 > 解决方案 > 测试使用静态方法返回不一致的结果

问题描述

我注意到我的 Karma 测试返回了一组不一致的结果。

他们经常通过,但经常,我得到这个错误:

例如 1) 如果按钮数大于 1,则应从课程内容中删除按钮元素

我得到Expected 3 to be 2了奇怪的场合。

例如 2) 如果按钮数等于 1,则不应从课程内容中删除按钮元素

我得到Expected 2 to be 1了奇怪的场合。

我正在测试静态方法,有没有办法可以保证一致的结果?

import { TestBed } from '@angular/core/testing';
import { CourseContentElementButtonService } from './course-content-element-button.service';
import { TEST_BUILDER_INITIAL_STATE } from '../../../course';

describe('CourseContentButtonService', () => {
  const course = TEST_BUILDER_INITIAL_STATE;
  const courseContent = course.modules[0].content;
  const courseContentUid = course.modules[0].content[0].uid;
  const courseContentElementUid = course.modules[0].content[0].button[0].uid;

  beforeEach(() => {
    TestBed.configureTestingModule({});
  });

  describe('addCourseContentElementButton()', () => {
    it('should add button element to course content', () => {
      const newCourseContent = CourseContentElementButtonService.addCourseContentElementButton(
        courseContent,
        courseContentElementUid,
        courseContentUid
      );
      expect(newCourseContent[0].button.length).toBe(2);
    });
  });

  describe('deleteCourseContentElementButton()', () => {
    it('should delete button element from course content if button count is more than 1', () => {
      let newCourseContent = CourseContentElementButtonService.addCourseContentElementButton(
        courseContent,
        courseContentElementUid,
        courseContentUid
      );
      expect(newCourseContent[0].button.length).toBe(2);
      newCourseContent = CourseContentElementButtonService.deleteCourseContentElementButton(
        newCourseContent,
        1,
        courseContentUid
      );
      expect(newCourseContent[0].button.length).toBe(1);
    });
    
    it('should not delete button element from course content if button count is equal to 1', () => {
      let newCourseContent = CourseContentElementButtonService.deleteCourseContentElementButton(
        courseContent,
        1,
        courseContentUid
      );
      expect(newCourseContent[0].button.length).toBe(1);
    });
  });
});

标签: angularkarma-jasmine

解决方案


假设您使用的是 Jasmine(您没有具体说明,但在我的经验中这是迄今为止最常见的) - 默认情况下,测试的顺序是随机的。而且您不会在每次测试之前重置状态。这意味着 addCourseContentElementButton 有 1/3 的机会在其他方法之前运行。

您可以确保您的测试不依赖于状态(即不依赖于其他测试的执行),或者,如果在您的情况下它们应该按顺序执行,请禁用随机顺序。

可以在此处找到 jasmine 的配置选项。


推荐阅读