Thanks Manfred,
I havent had a chance to look at the resources you provided yet, but I've
made som progress. My current spec looks like this and I wanted to update
this thread in case someone else is struggling.
import {Component, OnInit} from 'angular2/core'
import {NgFor} from 'angular2/src/common/directives/ng_for'
import {Sortable} from '../sortable'
import {
it,
describe,
expect,
injectAsync,
TestComponentBuilder,
} from 'angular2/testing'
import {By} from 'angular2/platform/common_dom'
import {BrowserDomAdapter} from
'angular2/src/platform/browser/browser_adapter'
BrowserDomAdapter.makeCurrent()
@Component({
directives: [NgFor, Sortable],
template: `
<div>
<sortable [items]="items" keys="name, sz: Size">
<div *ngFor="#item of items" class="item">{{item.name}}</div>
</sortable>
</div>
`
})
class TestApp {
public items: any[]
constructor() {
this.items = [{name:'c', sz:2}, {name:'a', sz:1}, {name:'b', sz:3},
{name:'d'}]
}
}
var setupTestComponent = (fn) => injectAsync([TestComponentBuilder], (tcb:
TestComponentBuilder) => {
return tcb.createAsync(TestApp).then((tc) => {
tc.detectChanges()
fn(tc)
}
)})
describe('Sortable', () => {
it('renders children elements', setupTestComponent((tc) => {
var items = tc.nativeElement.querySelectorAll('.item')
expect(items.length).toEqual(4)
expect($(items).text()).toEqual('cabd')
}))
it('renders header links from keys', setupTestComponent((tc) => {
var lis = tc.nativeElement.querySelectorAll('.sortable-header li')
expect(lis.length).toEqual(2)
expect($(lis).text()).toEqual('NameSize')
}))
it('sort on click (descending order)', setupTestComponent((tc) => {
tc.debugElement.query(By.css('.sortable-header
li')).triggerEventHandler('click', null)
tc.detectChanges()
var items = tc.nativeElement.querySelectorAll('.item')
expect($(items).text()).toEqual('dcba')
}))
it('reverse order on each subsequent click', setupTestComponent((tc) => {
tc.debugElement.query(By.css('.sortable-header
li')).triggerEventHandler('click', null)
tc.debugElement.query(By.css('.sortable-header
li')).triggerEventHandler('click', null)
tc.detectChanges()
var items = tc.nativeElement.querySelectorAll('.item')
expect($(items).text()).toEqual('abcd')
}))
})
- Daniel
On Friday, 25 December 2015 20:12:22 UTC+1, Manfred Steyer wrote:
>
> Hi Daniel,
>
> that looks great. Currently there are much resources about this topic. But
> there are two greate presentations from anguler-connect in London [1], [2]
> and the starter kit at [3] contains samples for some tests.
>
> Wishes,
> Manfred
>
> [1] https://www.youtube.com/watch?v=C0F2E-PRm44
> [2] https://www.youtube.com/watch?v=-lTGnYwnEuM
> [3] https://github.com/AngularClass/angular2-webpack-starter
>
> Am Freitag, 25. Dezember 2015 16:25:18 UTC+1 schrieb Daniel:
>>
>> Digging into the Angular2 source I've managed to get something like
>> this... it feels very convoluted thought and I'm trying to find how to
>> simplify it.
>>
>> import {Component, OnInit} from 'angular2/core'
>> import {NgFor} from 'angular2/src/common/directives/ng_for'
>> import {bootstrap} from 'angular2/platform/browser'
>> import {Sortable} from '../sortable'
>>
>> import {
>> iit,
>> it,
>> ddescribe,
>> describe,
>> expect,
>> injectAsync,
>> TestComponentBuilder,
>> beforeEachProviders
>> } from 'angular2/testing';
>>
>> import {BrowserDomAdapter} from
>> 'angular2/src/platform/browser/browser_adapter'
>> BrowserDomAdapter.makeCurrent()
>>
>> @Component({
>> directives: [NgFor, Sortable],
>> template: `
>> <div>
>> <sortable [items]="items">
>> <div *ngFor="#item of items">{{item.name}}</div>
>> </sortable>
>> </div>
>> `
>> })
>> class TestApp {
>> public items: any[]
>>
>> constructor() {
>> this.items = [{name: 'c'}, {name: 'a'}, {name: 'b'}]
>> }
>> }
>>
>> describe('Sortable', () => {
>> it('first spec', injectAsync([TestComponentBuilder], (tcb:
>> TestComponentBuilder) => {
>> return tcb.createAsync(TestApp)
>> .then((fixture) => {
>> expect(true).toEqual(true)
>> })
>> }))
>>
>> it('second spec', injectAsync([TestComponentBuilder], (tcb:
>> TestComponentBuilder) => {
>> return tcb.createAsync(TestApp)
>> .then((fixture) => {
>> expect(false).toEqual(false)
>> })
>> }))
>> })
>>
>>
>> Any ideas?
>>
>> On Thursday, 24 December 2015 19:35:50 UTC+1, Daniel wrote:
>>>
>>> Hi,
>>>
>>> I'm trying to find some information on how to best test a Component. I
>>> have a simple component that currently just looks like this.
>>>
>>> @Component({
>>> selector: 'sortable',
>>> inputs: ['items'],
>>> template: `
>>> <div><a id="#test" (click)="sort()">sort</a></div>
>>> <ng-content></ng-content>
>>> `
>>> })
>>> export class Sortable {
>>> public items: any[]
>>> private reverse: boolean = false
>>>
>>> sort() {
>>> this.items.sort((a, b) => {
>>> if (a.name > b.name) {
>>> return this.reverse ? 1 : -1
>>> } else if (a.name < b.name) {
>>> return this.reverse ? -1: 1
>>> } else {
>>> return 0
>>> }
>>> })
>>> this.reverse = !this.reverse
>>> }
>>> }
>>>
>>> I've got Jasmine setup and working based on the guide from angular.io
>>> but haven't found much information on how to best test Components. One
>>> guide seems to be bootstrap:ing like a normal app so this is what I got so
>>> far going down that route.
>>>
>>> import {Component, OnInit} from 'angular2/core'
>>> import {bootstrap} from 'angular2/platform/browser'
>>> import {Sortable} from '../sortable'
>>>
>>> @Component({
>>> selector: 'test-app',
>>> directives: [Sortable],
>>> template: `
>>> <div>
>>> <sortable [items]="items">
>>> <div *ngFor="#item of items">{{item.name}}</div>
>>> </sortable>
>>> </div>
>>> `
>>> })
>>> class TestApp {
>>> public items: string[]
>>>
>>> constructor() {
>>> this.items = [{name: 'c'}, {name: 'a'}, {name: 'b'}]
>>> }
>>> }
>>>
>>> describe('Sortable', () => {
>>> let app: TestApp
>>>
>>> beforeEach(done => {
>>> bootstrap(TestApp)
>>> .then(result => result.instance)
>>> .then(instance => {
>>> app = instance
>>> done()
>>> })
>>> })
>>>
>>> it('#sort', () => {
>>> // How to generate click?
>>> expect(app.items).toEqual([{name: 'c'}, {name: 'b'}, {name: 'a'}])
>>> })
>>> })
>>>
>>> This feels strange since it actually renders on the Jasmine test page.
>>> Would really appreciate some input on how to best test a component such as
>>> this. I want to make sure it renders the list as well as the order of items
>>> when the sort method is run.
>>>
>>> Thanks,
>>> - Daniel
>>>
>>>
>>>
--
You received this message because you are subscribed to the Google Groups
"AngularJS" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/angular.
For more options, visit https://groups.google.com/d/optout.