javascript - 在 Angular 2 的单元测试中模拟基类

标签 javascript unit-testing angular karma-jasmine

我正在尝试编写一个单元测试以查看是否调用了基类方法

这是基类

export abstract class Animal{
   protected eatFood() {
      console.log("EAT FOOD!")
   }
}

这是我要测试的类

export class Monkey extends Animal {
   onHungry(){
      this.eatFood();
   }
}

这里是测试

class MockAnimal {
  public eatFood() { 
    console.log("EAT MOCKED FOOD!");
  }
}

describe('Monkey', () => {
  beforeEach(() => {

    TestBed.configureTestingModule({
       declarations:[Monkey],
       providers: [
         { provide: Animal, useClass: MockAnimal }
       ]
    }
  });

  it('eat food when hungry', fakeAsync(() => {
    let fixture = TestBed.createComponent(Monkey);
    spyOn(fixture, 'eatFood');
    fixture.componentInstance.onHungry();
    expect(fixture.eatFood).toHaveBeenCalled();
  }));
}

我无法让单元测试运行这个 MockAnimal 类。这是怎么测试的?

最佳答案

TestBed 用于测试组件,就像在普通的 NgModule 中一样,您可以定义声明、导入、提供程序……但是您想要测试的是一个简单的类。在测试中你必须手动初始化它:

describe('Monkey', () => {
  it('eats if hungry', () => {
    const monkey = new Monkey();
    // spying will only work if 'eatFood' is public
    const eatFoodSpy = spyOn(monkey, 'eatFood');

    monkey.onHungry();

    expect(eatFoodSpy).toHaveBeenCalled();
  });
});

关于javascript - 在 Angular 2 的单元测试中模拟基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43313789/

相关文章:

未加载 Angular2 路由器弃用的依赖项

javascript - Angular - 来自变量的 ngModel 对象属性

.net - 模拟文件系统

unit-testing - Grails 单元测试中的 "junit.framework.AssertionFailedError: null"

javascript - 如何为 regex.exec() 使用 dotall 标志

javascript - 如何在我现有的 div 中打印对象的键值数组,并根据我的数据使用带循环的 JavaScript 为每个单独的 div 重复它

unit-testing - 如何对具有协程 `GlobalScope.launch` 的函数进行单元测试

angular - 刷新 Azure Blob 存储的 SAS token

javascript - 等高列不适用于调整大小事件

javascript - jQuery 事件处理程序不工作