Search icon CANCEL
Subscription
0
Cart icon
Your Cart (0 item)
Close icon
You have no products in your basket yet
Save more on your purchases! discount-offer-chevron-icon
Savings automatically calculated. No voucher code required.
Arrow left icon
Explore Products
Best Sellers
New Releases
Books
Videos
Audiobooks
Learning Hub
Newsletter Hub
Free Learning
Arrow right icon
timer SALE ENDS IN
0 Days
:
00 Hours
:
00 Minutes
:
00 Seconds
Learning Behavior-driven development with Javascript
Learning Behavior-driven development with Javascript

Learning Behavior-driven development with Javascript: Create powerful yet simple-to-code BDD test suites in JavaScript using the most popular tools in the community

Arrow left icon
Profile Icon Enrique Javier A Rubio
Arrow right icon
$54.99
Full star icon Full star icon Full star icon Full star icon Half star icon 4.9 (7 Ratings)
Paperback Feb 2015 392 pages 1st Edition
eBook
$9.99 $32.99
Paperback
$54.99
Subscription
Free Trial
Renews at $19.99p/m
Arrow left icon
Profile Icon Enrique Javier A Rubio
Arrow right icon
$54.99
Full star icon Full star icon Full star icon Full star icon Half star icon 4.9 (7 Ratings)
Paperback Feb 2015 392 pages 1st Edition
eBook
$9.99 $32.99
Paperback
$54.99
Subscription
Free Trial
Renews at $19.99p/m
eBook
$9.99 $32.99
Paperback
$54.99
Subscription
Free Trial
Renews at $19.99p/m

What do you get with Print?

Product feature icon Instant access to your digital copy whilst your Print order is Shipped
Product feature icon Paperback book shipped to your preferred address
Product feature icon Redeem a companion digital copy on all Print orders
Product feature icon Access this title in our online reader with advanced features
Product feature icon DRM FREE - Read whenever, wherever and however you want
Modal Close icon
Payment Processing...
tick Completed

Shipping Address

Billing Address

Shipping Methods
Table of content icon View table of contents Preview book icon Preview Book

Learning Behavior-driven development with Javascript

Chapter 2. Automating Tests with Mocha, Chai, and Sinon

Before we start making some BDD, let's familiarize ourselves with the basic tools available in JavaScript to write and execute a test. In this chapter, we will explore the main capabilities of Mocha, the most popular test runner in JavaScript. We will perform the following tasks:

  • Writing expressive assertions using the Chai package
  • Creating test doubles using the Sinon and sinon-chai packages
  • Exploring the basic techniques for organizing our test codebase

To achieve these goals, we will perform a small code kata, or coding exercise, where we will be able to practice not only the tools, but also the test-first cycle explained in the previous chapter.

Node and NPM as development platforms

All the tools that we will use are written in JavaScript. A long time ago, the only way to execute JavaScript was to use a browser, but those days are long gone. Nowadays, we can execute our development tools from the command line during our normal development cycle or from a Continuous Integration (CI) server whenever we commit our changes to a source code repository.

The most easy and productive way to run our test tools is to use Node. Node is a lightweight and highly-scalable platform for JavaScript, written on top of the excellent V8 JavaScript virtual machine. Node is especially good for applications that perform high-volume IO, but it can also be used as a development platform, as we will see in a moment.

Installing Node and NPM

The examples in this book will work with Node Version 0.10.x or above. If you don't have it installed already, you must do so to follow the code examples.

Tip

It is recommended that you do not install a version of Node...

Configuring your project with NPM

With the installation of Node, the Node Package Manager (NPM) is also installed. NPM is actually the utility that we will use for our normal development cycle.

NPM allows you to install libraries, manage the dependencies of your projects, and define a set of commands to build your code.

To start, just create a new folder for your project and initialize it from there:

$ me@~> mkdir validator
$ me@~> cd validator
$ me@~/validator> npm init

The last command, npm init, will invoke NPM to generate package.json inside the current directory; during the process, it will ask you some questions. Most of them are self-explanatory, but if you do not know what to answer just press ENTER. Do not worry; you will be able to edit the package.json file later. This is my package.json file:

{
  "name": "validator",
  "version": "0.1.0",
  "description": "A validation service for Weird LTD.",
  "main&quot...

Introducing Mocha

Mocha is a modern test runner that can be executed from Node as well as inside a browser. As we saw earlier, our main approach is to use Node. In this book, I am using Mocha Version 1.20.1, but any 1.x version should be OK.

We have already installed Mocha using NPM, so we can run it with the following command:

$ me@~/validator> ./node_modules/.bin/mocha -u bdd -R spec -t 500 --recursive

It fails because we do not have any test yet; we will fix it later. I will explain the exact meaning of these parameters in a moment. For now, note that, to execute Mocha, we need to find out where NPM has installed the executable of the tool. A package can be a simple library, or it can also contain an executable command-line tool, as is the case with Mocha. NPM always will install this executable in the node_modules/.bin/ folder; hence, we need to execute ./node_modules/.bin/mocha in order to invoke Mocha.

This would not have been necessary if we had installed Mocha as a global package...

More expressive assertions with Chai

We have already installed chai as a dependency of our project, but we have not yet used it. Specifically, I am using version 1.9.1, but any 1.x version should be OK.

Until now, we have been using the standard assert package to create our assertions. The assert package is not bad, but it is limited to a few assertions. It is not extensible, and some people found it a bit difficult to read. I personally always find myself wondering, "Is the first parameter the actual value or the expected one?" Actually, the first parameter is the actual value, and the second one is the expected value. This is important because the report message depends on distinguishing the actual value from the expected one. Let's change the code of our test to use chai:

var chai = require('chai'),
    expect = chai.expect,
    validator = require('../lib/validator');

describe('A Validator', function() {
  it('will return error.nonpositive...

Red/Green/Refactor

Now that we have a basic knowledge of Chai, we can continue with our coding. The code we already have in place is clearly not correct, so we need to add another test that forces us to make the code right.

Currently, we are implementing the rule about errors for nonpositive numbers, so we should finish it before continuing. Which test could we add to make our implementation fail? We can try testing the validator with valid numbers. Let's see the result:

describe('A Validator', function() {
  it('will return no errors for valid numbers', function() {
    expect(validator(3)).to.be.empty;
  });

  it('will return error.nonpositive for not strictly positive numbers', function() {
    expect(validator(0)).to.be.deep.equal(['error.nonpositive']);
  });
});

Note that we have added a new test for valid numbers that is failing. So now we fix it in a very simple way in lib/validator.js:

module.exports = function (n) {
  if(n === 0)
    return...

Test doubles with Sinon

A few weeks after going to production, our validator is a complete success but it also happens that potential new customers would like to have different sets of validation rules. Fortunately, our validator is configurable, but we somehow need to specify a different configuration for each customer.

The act of configuring a different set of rules for each customer is clearly another operation of the system and, hence, a different feature, so we are not really interested in testing it in the validator tests. We would like to isolate the tests about the validator feature and the configuration feature. To do so, we need to create an interface in a way that allows the validator to ask for the correct set of rules for the configuration. Then we can create a test double for such an interface in our tests. The test double will impersonate the real configuration and allow us to isolate our tests.

When creating these test doubles we need to design the shape of the interfaces...

Node and NPM as development platforms


All the tools that we will use are written in JavaScript. A long time ago, the only way to execute JavaScript was to use a browser, but those days are long gone. Nowadays, we can execute our development tools from the command line during our normal development cycle or from a Continuous Integration (CI) server whenever we commit our changes to a source code repository.

The most easy and productive way to run our test tools is to use Node. Node is a lightweight and highly-scalable platform for JavaScript, written on top of the excellent V8 JavaScript virtual machine. Node is especially good for applications that perform high-volume IO, but it can also be used as a development platform, as we will see in a moment.

Installing Node and NPM

The examples in this book will work with Node Version 0.10.x or above. If you don't have it installed already, you must do so to follow the code examples.

Tip

It is recommended that you do not install a version of Node whose...

Left arrow icon Right arrow icon

Description

This book is ideal for any JavaScript developer who is interested in producing well-tested code. If you have no prior experience with testing, Node.js, or any other tool, do not worry, as they will be explained from scratch.

Who is this book for?

TThis book is ideal for any JavaScript developer who is interested in producing well-tested code. If you have no prior experience with testing, Node.js, or any other tool, do not worry, as they will be explained from scratch.

What you will learn

  • Understand the basic concepts of BDD and how it is different from classic unit testing
  • Divide your system into different modules that can be tested separately, but at the same time not falling into the trap of unit testing
  • Use Mocha, Sinon.JS, and Chai to write expressive BDD features
  • Implement Cucumber.js to automate tests written in Gherkin so that your stakeholders can understand them
  • Discover how to test asynchronous systems, either based on callbacks or promises
  • Test a RESTful web API and a rich UI using WebDriverJS and Protractor
  • Refactor and keep your test code base maintainable using best practices and patterns such as PageObject
Estimated delivery fee Deliver to United States

Economy delivery 10 - 13 business days

Free $6.95

Premium delivery 6 - 9 business days

$21.95
(Includes tracking information)

Product Details

Country selected
Publication date, Length, Edition, Language, ISBN-13
Publication date : Feb 19, 2015
Length: 392 pages
Edition : 1st
Language : English
ISBN-13 : 9781784392642
Languages :
Tools :

What do you get with Print?

Product feature icon Instant access to your digital copy whilst your Print order is Shipped
Product feature icon Paperback book shipped to your preferred address
Product feature icon Redeem a companion digital copy on all Print orders
Product feature icon Access this title in our online reader with advanced features
Product feature icon DRM FREE - Read whenever, wherever and however you want
Modal Close icon
Payment Processing...
tick Completed

Shipping Address

Billing Address

Shipping Methods
Estimated delivery fee Deliver to United States

Economy delivery 10 - 13 business days

Free $6.95

Premium delivery 6 - 9 business days

$21.95
(Includes tracking information)

Product Details

Publication date : Feb 19, 2015
Length: 392 pages
Edition : 1st
Language : English
ISBN-13 : 9781784392642
Languages :
Tools :

Packt Subscriptions

See our plans and pricing
Modal Close icon
$19.99 billed monthly
Feature tick icon Unlimited access to Packt's library of 7,000+ practical books and videos
Feature tick icon Constantly refreshed with 50+ new titles a month
Feature tick icon Exclusive Early access to books as they're written
Feature tick icon Solve problems while you work with advanced search and reference features
Feature tick icon Offline reading on the mobile app
Feature tick icon Simple pricing, no contract
$199.99 billed annually
Feature tick icon Unlimited access to Packt's library of 7,000+ practical books and videos
Feature tick icon Constantly refreshed with 50+ new titles a month
Feature tick icon Exclusive Early access to books as they're written
Feature tick icon Solve problems while you work with advanced search and reference features
Feature tick icon Offline reading on the mobile app
Feature tick icon Choose a DRM-free eBook or Video every month to keep
Feature tick icon PLUS own as many other DRM-free eBooks or Videos as you like for just $5 each
Feature tick icon Exclusive print discounts
$279.99 billed in 18 months
Feature tick icon Unlimited access to Packt's library of 7,000+ practical books and videos
Feature tick icon Constantly refreshed with 50+ new titles a month
Feature tick icon Exclusive Early access to books as they're written
Feature tick icon Solve problems while you work with advanced search and reference features
Feature tick icon Offline reading on the mobile app
Feature tick icon Choose a DRM-free eBook or Video every month to keep
Feature tick icon PLUS own as many other DRM-free eBooks or Videos as you like for just $5 each
Feature tick icon Exclusive print discounts

Frequently bought together


Stars icon
Total $ 152.97
Learning JavaScript Data Structures and Algorithms
$48.99
Mastering JavaScript Design Patterns
$48.99
Learning Behavior-driven development with Javascript
$54.99
Total $ 152.97 Stars icon

Table of Contents

11 Chapters
1. Welcome to BDD Chevron down icon Chevron up icon
2. Automating Tests with Mocha, Chai, and Sinon Chevron down icon Chevron up icon
3. Writing BDD Features Chevron down icon Chevron up icon
4. Cucumber.js and Gherkin Chevron down icon Chevron up icon
5. Testing a REST Web API Chevron down icon Chevron up icon
6. Testing a UI Using WebDriverJS Chevron down icon Chevron up icon
7. The Page Object Pattern Chevron down icon Chevron up icon
8. Testing in Several Browsers with Protractor and WebDriver Chevron down icon Chevron up icon
9. Testing Against External Systems Chevron down icon Chevron up icon
10. Final Thoughts Chevron down icon Chevron up icon
Index Chevron down icon Chevron up icon

Customer reviews

Top Reviews
Rating distribution
Full star icon Full star icon Full star icon Full star icon Half star icon 4.9
(7 Ratings)
5 star 85.7%
4 star 14.3%
3 star 0%
2 star 0%
1 star 0%
Filter icon Filter
Top Reviews

Filter reviews by




Mike Ludemann Jul 18, 2019
Full star icon Full star icon Full star icon Full star icon Full star icon 5
Alle wichtigen Information und mehr sind vorhanden.
Amazon Verified review Amazon
SoftMil Jakub Milkiewicz PL7851665795 May 22, 2015
Full star icon Full star icon Full star icon Full star icon Full star icon 5
I am a pretty experienced developer (8-9 years mostly Java and other JVM-languages) who thought was pretty familiar with TDD, BDD and code design concepts. Unfortunately i was totally wrong ! The book really allowed me to open my eyes and see how much i was missing in these topics. It allowed me to finally understand the blurry line between TDD and BDD, write better tests, design in a more loose-coupled way and finally run-away from unit-tests (class/method-level unit tests) obsession and focus on features-testing as the right level of granularity for tests. The book (i haven't reached the last page yet) really reminds me Growing Object-Oriented Software, Guided by Tests book but i find it way more easy to read (written by non-native speaker), with complex concepts expressed clearly (always with an example ! ) and with a slightly different test-scope: building "logic/business" layer using BDD (my 2 favorite chapters), then REST API (with business layer being test double/stubbed) and finally UI all developed using test-first approach. That kind of approach seems to match with "Integration Tests Are a Scam" by J.B. Rainsberger.Although I am not js programmer and all examples and tools used in the book are javascript based, I didn't have any problem to read/use them (the author even drives you on installing all tools and shares his best practices on using them) so the book is a really good choice for non-javascript developers who would like to make a deep dive into modern way of building software using tests.I only wish the book was not a softcover...
Amazon Verified review Amazon
souidi sofian Jul 12, 2015
Full star icon Full star icon Full star icon Full star icon Full star icon 5
This book is very well done. He first explains what a test can be the difference in bdd and tdd. It teaches us to structure our tests with a practical case. You learn to test multiple browser using Protractor and WebDriver and even a rest web api. This book is to read for those who want to master the tests.
Amazon Verified review Amazon
Juanfe Mar 26, 2016
Full star icon Full star icon Full star icon Full star icon Full star icon 5
Enrique Amodeo has been so far one of the best tech writers I have found. Neither BDD or TDD was familiar to me, yet in the first chapters of the book I started to understand a lot, even to the point of being myself able to explain to others who also want to learn BDD and have some experience with TDD.This book is a must have if you want to become a better javascript developer. So far my experience has been great, but this doesn't mean that I haven't had my challenges. This is not easy, so keep the good spirits up and trust Amodeo, he is simply the best.
Amazon Verified review Amazon
M. Chowdhury Jul 13, 2015
Full star icon Full star icon Full star icon Full star icon Full star icon 5
Pretty comprehensive coverage on BDD. I have limited experience in JavaScript, and but it's not difficult to follow at all. The startup example was interesting for me to follow the BDD concepts. Chapters four, five and six on CucumberJS, REST API testing and WebDriverJS were the best for me. Highly recommend to any one interested in BDD in JS or other languages.
Amazon Verified review Amazon
Get free access to Packt library with over 7500+ books and video courses for 7 days!
Start Free Trial

FAQs

What is the digital copy I get with my Print order? Chevron down icon Chevron up icon

When you buy any Print edition of our Books, you can redeem (for free) the eBook edition of the Print Book you’ve purchased. This gives you instant access to your book when you make an order via PDF, EPUB or our online Reader experience.

What is the delivery time and cost of print book? Chevron down icon Chevron up icon

Shipping Details

USA:

'

Economy: Delivery to most addresses in the US within 10-15 business days

Premium: Trackable Delivery to most addresses in the US within 3-8 business days

UK:

Economy: Delivery to most addresses in the U.K. within 7-9 business days.
Shipments are not trackable

Premium: Trackable delivery to most addresses in the U.K. within 3-4 business days!
Add one extra business day for deliveries to Northern Ireland and Scottish Highlands and islands

EU:

Premium: Trackable delivery to most EU destinations within 4-9 business days.

Australia:

Economy: Can deliver to P. O. Boxes and private residences.
Trackable service with delivery to addresses in Australia only.
Delivery time ranges from 7-9 business days for VIC and 8-10 business days for Interstate metro
Delivery time is up to 15 business days for remote areas of WA, NT & QLD.

Premium: Delivery to addresses in Australia only
Trackable delivery to most P. O. Boxes and private residences in Australia within 4-5 days based on the distance to a destination following dispatch.

India:

Premium: Delivery to most Indian addresses within 5-6 business days

Rest of the World:

Premium: Countries in the American continent: Trackable delivery to most countries within 4-7 business days

Asia:

Premium: Delivery to most Asian addresses within 5-9 business days

Disclaimer:
All orders received before 5 PM U.K time would start printing from the next business day. So the estimated delivery times start from the next day as well. Orders received after 5 PM U.K time (in our internal systems) on a business day or anytime on the weekend will begin printing the second to next business day. For example, an order placed at 11 AM today will begin printing tomorrow, whereas an order placed at 9 PM tonight will begin printing the day after tomorrow.


Unfortunately, due to several restrictions, we are unable to ship to the following countries:

  1. Afghanistan
  2. American Samoa
  3. Belarus
  4. Brunei Darussalam
  5. Central African Republic
  6. The Democratic Republic of Congo
  7. Eritrea
  8. Guinea-bissau
  9. Iran
  10. Lebanon
  11. Libiya Arab Jamahriya
  12. Somalia
  13. Sudan
  14. Russian Federation
  15. Syrian Arab Republic
  16. Ukraine
  17. Venezuela
What is custom duty/charge? Chevron down icon Chevron up icon

Customs duty are charges levied on goods when they cross international borders. It is a tax that is imposed on imported goods. These duties are charged by special authorities and bodies created by local governments and are meant to protect local industries, economies, and businesses.

Do I have to pay customs charges for the print book order? Chevron down icon Chevron up icon

The orders shipped to the countries that are listed under EU27 will not bear custom charges. They are paid by Packt as part of the order.

List of EU27 countries: www.gov.uk/eu-eea:

A custom duty or localized taxes may be applicable on the shipment and would be charged by the recipient country outside of the EU27 which should be paid by the customer and these duties are not included in the shipping charges been charged on the order.

How do I know my custom duty charges? Chevron down icon Chevron up icon

The amount of duty payable varies greatly depending on the imported goods, the country of origin and several other factors like the total invoice amount or dimensions like weight, and other such criteria applicable in your country.

For example:

  • If you live in Mexico, and the declared value of your ordered items is over $ 50, for you to receive a package, you will have to pay additional import tax of 19% which will be $ 9.50 to the courier service.
  • Whereas if you live in Turkey, and the declared value of your ordered items is over € 22, for you to receive a package, you will have to pay additional import tax of 18% which will be € 3.96 to the courier service.
How can I cancel my order? Chevron down icon Chevron up icon

Cancellation Policy for Published Printed Books:

You can cancel any order within 1 hour of placing the order. Simply contact customercare@packt.com with your order details or payment transaction id. If your order has already started the shipment process, we will do our best to stop it. However, if it is already on the way to you then when you receive it, you can contact us at customercare@packt.com using the returns and refund process.

Please understand that Packt Publishing cannot provide refunds or cancel any order except for the cases described in our Return Policy (i.e. Packt Publishing agrees to replace your printed book because it arrives damaged or material defect in book), Packt Publishing will not accept returns.

What is your returns and refunds policy? Chevron down icon Chevron up icon

Return Policy:

We want you to be happy with your purchase from Packtpub.com. We will not hassle you with returning print books to us. If the print book you receive from us is incorrect, damaged, doesn't work or is unacceptably late, please contact Customer Relations Team on customercare@packt.com with the order number and issue details as explained below:

  1. If you ordered (eBook, Video or Print Book) incorrectly or accidentally, please contact Customer Relations Team on customercare@packt.com within one hour of placing the order and we will replace/refund you the item cost.
  2. Sadly, if your eBook or Video file is faulty or a fault occurs during the eBook or Video being made available to you, i.e. during download then you should contact Customer Relations Team within 14 days of purchase on customercare@packt.com who will be able to resolve this issue for you.
  3. You will have a choice of replacement or refund of the problem items.(damaged, defective or incorrect)
  4. Once Customer Care Team confirms that you will be refunded, you should receive the refund within 10 to 12 working days.
  5. If you are only requesting a refund of one book from a multiple order, then we will refund you the appropriate single item.
  6. Where the items were shipped under a free shipping offer, there will be no shipping costs to refund.

On the off chance your printed book arrives damaged, with book material defect, contact our Customer Relation Team on customercare@packt.com within 14 days of receipt of the book with appropriate evidence of damage and we will work with you to secure a replacement copy, if necessary. Please note that each printed book you order from us is individually made by Packt's professional book-printing partner which is on a print-on-demand basis.

What tax is charged? Chevron down icon Chevron up icon

Currently, no tax is charged on the purchase of any print book (subject to change based on the laws and regulations). A localized VAT fee is charged only to our European and UK customers on eBooks, Video and subscriptions that they buy. GST is charged to Indian customers for eBooks and video purchases.

What payment methods can I use? Chevron down icon Chevron up icon

You can pay with the following card types:

  1. Visa Debit
  2. Visa Credit
  3. MasterCard
  4. PayPal
What is the delivery time and cost of print books? Chevron down icon Chevron up icon

Shipping Details

USA:

'

Economy: Delivery to most addresses in the US within 10-15 business days

Premium: Trackable Delivery to most addresses in the US within 3-8 business days

UK:

Economy: Delivery to most addresses in the U.K. within 7-9 business days.
Shipments are not trackable

Premium: Trackable delivery to most addresses in the U.K. within 3-4 business days!
Add one extra business day for deliveries to Northern Ireland and Scottish Highlands and islands

EU:

Premium: Trackable delivery to most EU destinations within 4-9 business days.

Australia:

Economy: Can deliver to P. O. Boxes and private residences.
Trackable service with delivery to addresses in Australia only.
Delivery time ranges from 7-9 business days for VIC and 8-10 business days for Interstate metro
Delivery time is up to 15 business days for remote areas of WA, NT & QLD.

Premium: Delivery to addresses in Australia only
Trackable delivery to most P. O. Boxes and private residences in Australia within 4-5 days based on the distance to a destination following dispatch.

India:

Premium: Delivery to most Indian addresses within 5-6 business days

Rest of the World:

Premium: Countries in the American continent: Trackable delivery to most countries within 4-7 business days

Asia:

Premium: Delivery to most Asian addresses within 5-9 business days

Disclaimer:
All orders received before 5 PM U.K time would start printing from the next business day. So the estimated delivery times start from the next day as well. Orders received after 5 PM U.K time (in our internal systems) on a business day or anytime on the weekend will begin printing the second to next business day. For example, an order placed at 11 AM today will begin printing tomorrow, whereas an order placed at 9 PM tonight will begin printing the day after tomorrow.


Unfortunately, due to several restrictions, we are unable to ship to the following countries:

  1. Afghanistan
  2. American Samoa
  3. Belarus
  4. Brunei Darussalam
  5. Central African Republic
  6. The Democratic Republic of Congo
  7. Eritrea
  8. Guinea-bissau
  9. Iran
  10. Lebanon
  11. Libiya Arab Jamahriya
  12. Somalia
  13. Sudan
  14. Russian Federation
  15. Syrian Arab Republic
  16. Ukraine
  17. Venezuela
Modal Close icon
Modal Close icon