【问题标题】:Karma/Jasmine: Unable to detect changes for @Input property using detectChanges()Karma/Jasmine:无法使用 detectChanges() 检测到 @Input 属性的更改
【发布时间】:2018-07-24 01:57:01
【问题描述】:

我正在尝试更改组件的@Input 属性并基于新属性,尝试检查按钮是否启用/禁用。参考代码here

我正在遵循此链接中描述的确切程序,但无法正常工作。我正在使用 detectChanges() 更改值,但它没有按预期给出结果。

HTML:

<form>
    <label>Email</label>
    <input type="email"
           #email>
    <label>Password</label>
    <input type="password"
           #password>
    <button type="button" 
            (click)="login(email.value, password.value)"
            [disabled]="!enabled">Login
    </button>
  </form>

组件:

@Input() enabled = true;

规格:

describe('testing app component', () => {
  let component;
  let service;
  let fixture;
  let element;
  let atag;
  let loginEl;
  let passwordEl;
  let submitEl;

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [
        AppComponent
      ],
      providers: [
        AppService
      ]
    }).compileComponents();

    // create component fixture
    fixture = TestBed.createComponent(AppComponent);

    // get component's instance for testing
    component = fixture.debugElement.componentInstance;

    // getting service instance from tets bed
    service = TestBed.get(AppService);

    // getting button element
    fixture.detectChanges();
    element = fixture.debugElement.query(By.css('button'));
    atag = fixture.debugElement.query(By.css('a'));

    submitEl = fixture.debugElement.query(By.css('button'));
    loginEl = fixture.debugElement.query(By.css('input[type=email]'));
    passwordEl = fixture.debugElement.query(By.css('input[type=password]'));
  });

  it('testing input property: @Input enabled', () => {
    expect(component.enabled).toBe(true);
    expect(submitEl.nativeElement.disabled).toBeFalsy();
    component.enabled = false;
    fixture.detectChanges();
    expect(submitEl.nativeElement.disabled).toBeTruthy();
  });
});

但是这个规范会抛出一个错误:Error: Expected false to be truthy.

【问题讨论】:

    标签: angular unit-testing karma-jasmine


    【解决方案1】:

    编辑

    您创建组件的方式也不正确。应该是

    component = fixture.componentInstance;
    

    DEMO

    原创

    您应该在视图更新后再次获取您的dom 元素(即在调用detectChanges() 之后)。如果您不这样做,那么您的测试将根据更新前存在的视图进行验证。

    submitEl = fixture.debugElement.query(By.css('button'));
    

    - 测试规范

    it('testing input property: @Input enabled', () => {
        expect(component.enabled).toBe(true);
        expect(submitEl.nativeElement.disabled).toBeFalsy();
        component.enabled = false;
        fixture.detectChanges();
    
         // fetch dom element again
        submitEl = fixture.debugElement.query(By.css('button'));
        expect(submitEl.nativeElement.disabled).toBeTruthy();
    });
    

    【讨论】:

    • 你的前两个期望通过了吗? expect(component.enabled).toBe(true); expect(submitEl.nativeElement.disabled).toBeFalsy();
    • 而且你创建组件的方式也是错误的。必须是component = fixture.componentInstance;
    • 是的,其他期望正在通过。而且,我更改了创建夹具的方式,但错误仍然相同。它不工作。我无法在在线编辑器中复制相同的内容,有什么方法可以共享代码吗?
    • 那么,在在线编辑器中,您的测试用例通过了吗?如果是这样,那么只需重新运行您的测试用例并进行验证。
    • 检查这个stackblitz.com/edit/…它确实有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 2018-10-04
    相关资源
    最近更新 更多