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:
- 
t.equals
 - 
t.ok
 - 
t.error
 
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