如何在Angular 4 spec文件中模拟nativeElement.focus()

时间:2018-02-21 14:59:25

标签: javascript angular specifications

我有一个使用ElementRef的方法,该方法定义如下。

@ViewChild('idNaicsRef') idNaicsRef: ElementRef;

ElementRef然后使用.nativeElement.focus()设置焦点。

该方法在运行规范时失败,称'undefined是一个对象'

2 个答案:

答案 0 :(得分:2)

尽管httpNick的答案应该有效,但我最后还是向我的团队中的一位建筑师询问了这个问题,他让我找到了一个稍微不同的解决方案,可能会更简单一点。

describe(MyComponent.name, () => {

    let comp: MyComponent;

    describe('myFunction', () => {

        it('calls focus', () => {

            comp.idNaicsRef = {
                nativeElement: jasmine.createSpyObj('nativeElement', ['focus'])
            }

            comp.myFunction();

            expect(comp.idNaicsRef.nativeElement.focus).toHaveBeenCalled();
        });
    });

这个特定的例子只是测试是否已经调用了focus方法。当我测试我的方法时,这是我感兴趣的测试,但你当然可以测试你想要的任何东西。关键是预先设置(在向我展示之前难以捉摸)。

答案 1 :(得分:1)

这应该有效。这只是创建一个间谍对象然后你可以用你想要的任何东西填充它,所以你甚至可以检查它是否在你的单元测试中被调用。

  import createSpyObj = jasmine.createSpyObj;
  comp.idNaicsRef = createSpyObj('idNaicsRef', ['nativeElement']);
  comp.idNaicsRef.nativeElement = { focus: () => { }};

comp是对您正在测试的组件的引用。

createSpyObj来自茉莉花导入