当前位置: 首页 > 面试题库 >

如何在Angular 2中对指令进行单元测试?

督弘化
2023-03-14
问题内容

问题: 我希望能够对 Angular 2中的指令 进行 单元测试,以确保它可以正确编译。

在Angular 1中,之后可以使用$compile(angular.element(myElement)service和call
$scope.$digest()。我特别希望能够在单元测试中做到这一点,这样我就可以测试Angular最终<div my-attr-directive/>my-attr-directive编译后的代码中运行了。

限制条件:

  • 使用JAVASCRIPT的Angular 2 。所有有些相关的资源似乎都需要TS。也许这些资源确实可以解决问题,而我对TS的理解还很薄弱
  • 茉莉花中的单元测试
  • 一定不要太笨拙,以至于我的单元测试最终会失败。

问题答案:

使用TestBed测试编译指令

假设您有以下指令:

@Directive({
  selector: '[my-directive]',
})
class MyDirective {
  public directiveProperty = 'hi!';
}

您要做的是创建一个使用指令的组件(它可以仅用于测试目的):

@Component({
  selector: 'my-test-component',
  template: ''
})
class TestComponent {}

现在,您需要创建一个声明了它们的模块:

describe('App', () => {

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [
        TestComponent,
        MyDirective
      ]
    });
  });

  // ...

});

您可以将模板(包含指令)添加到组件中,但是可以通过覆盖测试中的模板来动态处理它:

it('should be able to test directive', async(() => {
  TestBed.overrideComponent(TestComponent, {
    set: {
      template: '<div my-directive></div>'
    }
  });

  // ...

}));

现在,您可以尝试编译该组件,并使用进行查询By.directive。最后,可以使用来获取指令实例injector

TestBed.compileComponents().then(() => {
  const fixture = TestBed.createComponent(TestComponent);
  const directiveEl = fixture.debugElement.query(By.directive(MyDirective));
  expect(directiveEl).not.toBeNull();

  const directiveInstance = directiveEl.injector.get(MyDirective);
  expect(directiveInstance.directiveProperty).toBe('hi!');
});

#旧答案:

要测试指令,您需要使用它创建一个伪造的组件:

@Component({
  selector: 'test-cmp',
  directives: [MyAttrDirective],
  template: ''
})
class TestComponent {}

您可以在组件本身中添加模板,但是可以通过覆盖测试中的模板来动态处理模板:

it('Should setup with conversation', inject([TestComponentBuilder], (testComponentBuilder: TestComponentBuilder) => {
    return testComponentBuilder
      .overrideTemplate(TestComponent, `<div my-attr-directive></div>`)
      .createAsync(TestComponent)
      .then((fixture: ComponentFixture<TestComponent>) => {
        fixture.detectChanges();
        const directiveEl = fixture.debugElement.query(By.css('[my-attr-directive]'));
        expect(directiveEl.nativeElement).toBeDefined();
      });
  }));

请注意,您能够测试呈现的指令,但我找不到以组件的方式测试指令的方法(指令没有TestComponentBuilder)。



 类似资料:
  • 问题内容: 在AngularJS中对隔离范围进行单元测试的好方法是什么 JSFiddle显示单元测试 指令段 我想,以确保指令监听的变化-这确实 不是 工作,一个孤立的范围: 更新: 我通过检查是否将预期的观察者添加到了子作用域中来使其工作,但是它非常脆弱,并且可能以未记录的方式使用访问器(也可能随时更改,恕不另行通知!)。 更新2: 正如我提到的那样,它很脆!这个想法仍然有效,但是在新版本的An

  • 问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样:

  • 问题内容: 我一直在学习AngularJS,并且在单元测试方面进展非常顺利,但是我遇到了一个棘手的问题。 假设我有一个简单的表格,例如: 如果我正在测试类似控制器的东西,我知道我会这样写(使用Jasmine + Karma): 但是我不知道我需要注入哪些服务,也没有运气在指南或文档中找到有关单元测试的文档。 一个单元如何在Angular中测试表单? 问题答案: 我不认为这是对此类内容进行单元测试的

  • 问题内容: 我有一个已定义的AngularJS指令。我正在尝试与Jasmine进行单元测试。 根据此建议,我的JasmineJavaScript如下所示: 当我在Jasmine spec错误中运行此命令时,出现以下错误: 我想要的只是让templateUrl原样加载- 我不想使用。我相信这可能与使用ngMock而不是ngMockE2E有关。如果是罪魁祸首,如何使用后者而不是前者? 提前致谢! 问题

  • 本文向大家介绍对Angular.js Controller如何进行单元测试,包括了对Angular.js Controller如何进行单元测试的使用技巧和注意事项,需要的朋友参考一下 一、写个简单的Angular App 在开始写测试之前,我们先写一个简单的计算App,它会计算两个数字之和。 代码如下: 二、简单说说里面涉及的一些基本概念: 创建一个 module 什么是angular.modul

  • 问题内容: 如您所知,异常情况下会引发异常。那么如何模拟这些异常呢?我觉得这是挑战。对于此类代码段: 有人有好主意吗? 问题答案: 其他答案已经解决了如何编写用于检查是否引发异常的单元测试的一般问题。但是我认为您的问题实际上是在询问如何获取代码以首先引发异常。 以您的代码为例。在简单的单元测试的环境中,很难在内部引发异常。问题是,为了使异常发生,代码(通常)需要在网络中断的计算机上运行。安排在单元