2017-03-15 14 views
0

我正在测试一个角度工具栏组件,它通过@ngrx/store触发状态改变操作。当行为测试Angular Components可以查找另一个Component的实例吗?

我有另一个组件订阅了这些状态更改,以便更新其自身的内部状态。

所以在karma/jasmine单元测试中,我触发了一个工具栏按钮的点击。然后,我只想在另一个组件上spy并声明它的变更函数被调用。

所以现在的问题是,不改变与ViewParent/ViewChild指令在现有的组件只是其中OFC将被视为代码气味测试,我怎么查找的角度成分的实例?

回答

2

可以获取子组件的正确实例,以便像这样测试行为。

您可以查询父通过指令来发现孩子:

import { By } from '@angular/platform-browser'; 
... 
let childComponentInstance: ChildComponent; 

// After setting up your component in the TestBed... 
parentComponentFixture = TestBed.createComponent(ParentComponent); 
... 

// Reference the child component from your parent component fixture 
childComponentInstance = parentComponentFixture 
    .debugElement 
    .query(By.directive(ChildComponent)) 
    .componentInstance; 

然后,您可以使用您的测试方法childComponentInstance

正如你所说,这不再是一个真正的单元测试和多行为测试。

(可能需要调用detectChanges()parentComponentFixture正确加载取决于什么被绑定到它的孩子)

1

我认为你可能会过度看待事物。

@ ngrx/store允许您订阅存在于任何组件树之外的此通用存储。因此,如果您想将事件发送到@ ngrx/store并订阅到其他组件中的@ ngrx/store,那么在测试其他组件时,只需创建您的商店,发送您的事件并查看您的组件是否正在测试正确回应那些“商店事件”。

当您测试发送事件的第一个组件时,请窥视商店并确认它正在接收来自第一个组件的正确事件。

如果你的测试确认了第一部件正常发送的事件,你可以确认的是,第二部分正确地响应事件,那么你有正确的单元通过商店测试你的组件交互的两侧。

+0

我有点同意你从单元测试的角度,我并指定在该职位。但是,它并没有真正以封装的方式描述行为。有人可能会删除第一个组件的调用行为和单元测试,第二个组件的测试仍会通过 - 但行为已被破坏。我想这突出了TDD和BDD之间的差距。我想测试行为,而不必进行完整的e2e测试。 –

+0

对我来说,单元测试是关于测试'单元'的。所以,如果你想测试整个互动,那么它的无论是关于寻找一个封装了交互的双方,即使这样的单元测试将更像一个集成测试,一个更大的“单位”。好消息是,您可以对这些类型的集成测试使用相同类型的测试设置 - 您不一定必须切换到量角器测试 – snorkpete

相关问题