Vicente Rodríguez

Nov. 4, 2016

Como hacer pruebas en javascript con tape

En este tutorial usaremos la libreria tape para hacer tests en javascript.

El código esta en github.

Instalando los paquetes


npm init -y

npm install --save superagent

npm install --save-dev tape tap-spec babel-register babel-core babel-loader babel-preset-es2015

Necesitamos agregar el script de test en el package.json:


 "scripts": {

    "test": "tape -r babel-register -- test/*_test.js | tap-spec",

 }

creamos un archivo .babelrc:


{ "presets": ["es2015"] }

nos servirá para probar el código ya que este esta en ecmascript 2015.

Necesitamos un webpack.config.js:


var path = require("path")



module.exports = {

  entry: {

    main: path.join(__dirname,"js/app.js")

  },

  output: {

    filename: "[name].js",

    path: path.join(__dirname, "dist")

  },

  resolve: {

    root: path.join(__dirname, "js"),

    extensions: ["", ".js"],

    moduleDirectories: ["node_modules"]

  },

  module: {

    loaders: [

      {

        test: /\.js?$/,

        exclude: /node_modules/,

        loader: "babel-loader",

        query: {

          presets: ["es2015"]

        }

      }

    ]

  },

  debug: true

}

Creando los tests

creamos una carpeta test, dentro un archivo api_test.js:


var test = require("tape")

import Api from "./../lib/api.js"

var url = "http://jsonplaceholder.typicode.com/posts"

var client = new Api(url)

var id = 5

Necesitamos importar tape y un objeto api que crearemos mas adelante, este objeto recibe una url de donde extrae información en formato json y tiene dos métodos, uno para conseguir todos los registros (en este caso posts) Y el otro para obtener solo un registro indicándolo por id. Creamos el cliente del api y le pasamos una url, también creamos una variable id para posteriormente pedir ese registro.

Creamos el primer test:


test("client.get() should be a function", function(t) {



  t.equals(typeof client.get, 'function', "should be a function")

  t.end()

})

para crear un test necesitamos tener la función importada desde tape, esta recibe dos parámetros, una descripción y un callback con un objeto t que permite funciones como:

para comprobar que la información que obtengamos sea correcta, en nuestra primera prueba usamos t.equals para verificar que el método client.get sea una función.




test("client.get_one() should be a function", function (t) {

  t.equals(typeof client.get_one, 'function', "should be a function")

  t.end()

})

El segundo test comprueba que el segundo método de la api también sea una función valida.


test("should get a list of posts", function(t) {

  client.get(function (data) {

    t.ok(Array.isArray(data), "should be an array")

    t.end()

  })

})

En el tercer test ya empezamos a comprobar la información que regresa el primer método, el que pide todos los registros, en este caso usamos t.ok y con la ayuda de la función isArray que nos devuelve true o false si la información es un array o no, en caso que lo sea devuelve true y t.ok pasa la prueba, si devuelve false t.ok nos regresa un error.


test("should get one post", function(t) {

  client.get_one(id , function (data) {

     t.error(Array.isArray(data), "should not be an array")

     t.equals(typeof data, "object", "should be an object")

     t.end()

  })

})

En la ultima prueba comprobamos el método que solo regresa un registro, como solo es uno tiene que ser un objeto, usamos t.error para verificar si la información es un array o no, si lo es marca un error y si es un objeto pasa la prueba.

Creando el api

Para finalizar y poder correr los test necesitamos crear el archivo con el api, este esta en una carpeta llamada lib:

Api.js


import request from 'superagent'



export default class Api {

  constructor(url){

    this.url = url

  }

  get(callback){

    Promise.resolve(request.get(this.url))

      .then((data) => {

       callback(data.body)

      })

  }

  get_one(id, callback){

    Promise.resolve(request.get(`${this.url}/${id}`))

      .then((data) => {

        callback(data.body)

      })

  }

}

Usamos superagent para realizar la petición ajax y promesas para manejar la petición.

Para correr los tests:


npm test