automated testing in emberjs

43
Intro to Testing an EmberJS Application Ben Limmer EmberJS Denver Meetup 7/29/2015

Upload: ben-limmer

Post on 17-Aug-2015

43 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Automated Testing in EmberJS

Intro to Testing an EmberJS Application

Ben Limmer EmberJS Denver Meetup

7/29/2015

Page 2: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

slides are available on slideshare / ember.party

Page 3: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

why do we test?

Page 4: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

write better code

less need for manual qa

confidence when refactoring

living documentation

confidence when upgrading

Page 5: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

3 levels of testing

Page 6: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

Unit

Integration

Acceptance

Page 7: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

Unit

Integration

Acceptance

Page 8: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

Unit

Integration

Acceptance

Page 9: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

ember unit tests

• actions

• computed properties with sophisticated logic

• mixins

• util functions

Page 10: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

ember unit tests

function

input

expected output

Page 11: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

Unit

Integration

Acceptance

Page 12: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

ember integration tests

• components

• actions sent from components

Page 13: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

ember integration tests

component

interaction

expected state

Page 14: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

ember integration tests

component

interaction

expected action

Page 15: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

Unit

Integration

Acceptance

Page 16: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

ember acceptance tests

• rendered routes

• transitions between routes

• communicating with the (fake) server

Page 17: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

ember acceptance tests

application

interaction

expected state

application

interaction

expected state

Page 18: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

qunit vs. mocha

Page 19: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

qunit vs. mocha (chai)

Page 20: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

qunit

• 1st class support

• syntax is not as ‘fluent’

Page 21: Automated Testing in EmberJS

qunit

test('it renders', function(assert) { this.render(hbs`{{foo-bar}}`); assert.equal(this.$('button').text(), 'Click Me');});

Page 22: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

mocha

• Good support, but not 1st class

• Highly fluent syntax

Page 23: Automated Testing in EmberJS

mocha / chai

it('has a button with text', function() { this.render(hbs`{{foo-bar}}`); expect(this.$('button').text()).to.equal('Click Me');});

Page 24: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

demo

Page 25: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

don’t panic - source is on github

Page 26: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

what do we test?

Page 27: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

Unit

Integration

Acceptance

Page 28: Automated Testing in EmberJS

mixins/authenticated-route.jsexport default Ember.Mixin.create({ session: Ember.inject.service(), signInRoute: 'sign-in',

beforeModel: function() { if (this.get('session.isLoggedIn')) { return; } else { this.replaceWith(this.get('signInRoute')); } }});

Page 29: Automated Testing in EmberJS

mixins/authenticated-route-test.jsdescribe('beforeModel', function() { const signInRoute = 'sign-in';

let subject, replaceWithStub, session; beforeEach(function() { const AuthenticatedRouteObject = Ember.Route.extend( AuthenticatedRouteMixin);

replaceWithStub = sinon.stub(); session = Ember.Object.create();

subject = AuthenticatedRouteObject.create({ session: session, signInRoute: signInRoute, replaceWith: replaceWithStub }); });

it('does nothing if logged in'); it('transitions to the sign in route if not logged in');});

Page 30: Automated Testing in EmberJS

it('does nothing if logged in', function() { session.set(‘isLoggedIn’, true); subject.beforeModel(); expect(replaceWithStub.called).to.be.false; });

it('transitions to the sign in route if not logged in', function() { session.set('isLoggedIn', false); subject.beforeModel(); expect(replaceWithStub.withArgs(signInRoute).calledOnce).to.be.true; });

mixins/authenticated-route-test.js

Page 31: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

Unit

Integration

Acceptance

Page 32: Automated Testing in EmberJS

components/sign-in-form.hbs

1 <h4 id='sign-in-greeting'> 2 Click the Button Below to Login as {{user.email}} 3 </h4> 4 <button id='sign-in-cta' class='button' {{action 'signIn'}}> 5 Sign In 6 </button>

Page 33: Automated Testing in EmberJS

components/sign-in-form.js

1 export default Ember.Component.extend({ 2 actions: { 3 signIn: function() { 4 this.sendAction(‘signIn', this.get('user')); 5 } 6 } 7 });

Page 34: Automated Testing in EmberJS

components/sign-in-form-test.js

it('shows the user\'s email address', function() { this.set('user', Ember.Object.create({ email: '[email protected]' }));

this.render(hbs`{{sign-in-form user=user}}`); expect(this.$('#sign-in-greeting').text()).to.contain('[email protected]'); });

it('has a button to login', function() { this.render(hbs`{{sign-in-form}}`); expect(this.$('button#sign-in-cta').length).to.equal(1); });

Page 35: Automated Testing in EmberJS

components/sign-in-form-test.js

it('sends the login action with the user when clicking the button', function(done) { const user = Ember.Object.create({ email: '[email protected]' }); this.set('user', user); this.on('signIn', function(actionUser) { expect(actionUser).to.equal(user); done(); });

this.render(hbs`{{sign-in-form user=user signIn='signIn'}}`); this.$('button#sign-in-cta').click(); });

Page 36: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

Unit

Integration

Acceptance

Page 37: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

Page 38: Automated Testing in EmberJS

acceptance-test/sign-in-test.js

describe('success', function() { beforeEach(function() { server.create('user', { email: '[email protected]', password: 'guest' }); });

it('transitions to the dashboard on successful login');

it('shows a flash message on successful login');});

Page 39: Automated Testing in EmberJS

acceptance-test/sign-in-test.js

it('transitions to the dashboard on successful login', function() { visit('/sign-in'); click('button#sign-in-cta');

andThen(function() { expect(currentPath()).to.equal('dashboard'); }); });

it('shows a flash message on successful login', function() { visit('/sign-in'); click('button#sign-in-cta');

andThen(function() { expect(find('.alert-box.success').length).to.equal(1); }); });

Page 40: Automated Testing in EmberJS

acceptance-test/sign-in-test.js

describe('failure', function() { beforeEach(function() { // API will return 400 server.create('user', { email: '[email protected]', password: 'guest' }); });

it('does not transition to the dashboard on failure');

it('shows a danger flash message on login failure');});

Page 41: Automated Testing in EmberJS

acceptance-test/sign-in-test.js

it('does not transition to the dashboard on failure', function() { visit('/sign-in'); click('button#sign-in-cta');

andThen(function() { expect(currentPath()).to.equal('sign-in'); }); });

it('shows a danger flash message on login failure', function() { visit('/sign-in'); click('button#sign-in-cta');

andThen(function() { expect(find('.alert-box.danger').length).to.equal(1); }); });

Page 42: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

thank you!" blimmer # l1m5 $ [email protected]! ember.party

Page 43: Automated Testing in EmberJS

Ben LimmerEmberJS Meetup - 7/29/2015 ! ember.party

demo project code

• https://github.com/blimmer/emberjs-denver-testing-talk