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