2012-06-22 8 views
8

¿Qué marcos de prueba están disponibles para probar vistas y son map y reduce funciones, filtros, listas, espectáculos, etc. de mi CouchDB?Probando vistas de CouchDB, filtros, listas, espectáculos, etc.

Idealmente, el marco permite probar cada función de forma unitaria, así como proporcionar soporte para probar un conjunto dado de vistas, filtros, etc., contra un conjunto de datos en una instancia de CouchDB.

He encontrado una publicación de blog en writing a test suite for the CouchDB API pero es de 2010 y me preguntaba qué ha pasado desde entonces.

Respuesta

4

Usaría el marco TDD Expresso para Node.js. La sobrecarga de escribir una aplicación Node.js no será un esfuerzo desperdiciado.

Instalar Node.js desde la página de descarga: nodejs.org/download

Asegúrese de que usted también consigue el MNP (gestor de paquetes Node.js).

Con el marco expresso puede probar fácilmente cualquiera de las funciones RESTful en CouchDB.

Aquí es prueba de una muestra de Node.js que se comunica con CouchDB:

var http = require('http'); 
var url = require('url'); 
var log_level = 5; 
var base_url = 'http://localhost:5984/'; 
var delete_db_at_end = false; 

/** 
* This test fetches all the data from a database and verifies that the data is 
* returned as it should. 
*/ 
exports.testCouchDBCartoonsAllDocs = function(beforeExit, assert) { 
    curl('GET', base_url + 'cartoons/_all_docs', null, function(response) { 
     assert.equal(7, response.total_rows); 
     assert.equal('Donald Duck', response.rows[1].id); 
    }); 
} 

/** 
* This test creates a database for this test only and deletes it at the end if the 
* global parameter delete_db_at_end is set to true, otherwise it is left as is for 
* human inspection. 
* 
*/ 
exports.testCreateDatabaseTestAddAndDestroy = function(beforeExit, assert) { 
    var dbname = 'test_db_cartoon'; 
    deleteExistingDatabase(dbname, assert, function(response) { 
     /* Create the database */ 
     curl('PUT', base_url + dbname, null, function(response) { 
      assert.equal(true, response.ok); 
      curl('PUT', base_url + dbname + '/Donald+Duck', '{"publisher":"Walt Disney"}', function(response){ 
       assert.equal(true, response.ok); 
       assert.equal('Donald Duck', response.id); 
       curl('GET', base_url + dbname + '/Donald+Duck', null, function(response) { 
        assert.equal('Donald Duck', response._id); 
        assert.equal('Walt Disney', response.publisher); 
        /* Finally we delete the database from CouchDB */ 
        if (delete_db_at_end) { 
         deleteExistingDatabase(dbname, assert, function(response) { 
          assert.equal(true, response.ok); 
         }); 
        } 
       }); 
      }); 
     }); 
    }); 
} 

/** 
* This is a helper function that deletes the database if it exists so 
* that the tests can run even if they where interrupted. 
*/ 
function deleteExistingDatabase(dbname, assert, callback) { 
    curl('GET', base_url + dbname, null, function(response) { 
     if (response.db_name === dbname) { 
      log(1, 'About to delete the database ' + dbname); 
      curl('DELETE', base_url + '/' + dbname, null, function(response) { 
       callback(response); 
      }); 
     } else { 
      callback(response); 
     } 
    }); 
} 

/** 
* This is a helper method to manage the RESTful sending to the database 
*/ 
function curl(method, urlString, payload, callback) { 
    log(1, method + ' ' + urlString); 
    var auth = 'Basic ' + new Buffer('username:password').toString('base64'); 
    log(7, auth); 

    var options = url.parse(urlString); 
    options.method = method; 
    options.headers = { 
      'Content-Encoding': 'UTF8', 
      'Content-Type': 'application/json', 
      'Authorization' : auth 
    }; 
    log(7, options); 

    var req = http.request(options, function (res) { 
     var data = ""; 
     res.setEncoding('UTF8'); 
     res.on('data', function (chunk) { 
      data += chunk; 
     }); 
     res.on('end', function (chunk) { 
      var response = JSON.parse(data); 
      log(5, response); 
      callback(response); 
     }); 
    }); 
    if (payload) { 
     req.write(payload); 
    } 
    req.end(); 
} 


/** 
* This simple logger logs message depending on the log_level set at 
* the top of this file. 
*/ 
function log(level, message) { 
    if (level<=log_level) { 
     console.log(message); 
    } 
} 

En la misma carpeta que ha guardado este archivo ejecute este comando:

npm install expresso 

ejecutar la prueba mediante la emisión este comando:

node_modules/expresso/bin/expresso test.js 

Esta es la salida de la consola del comando de arriba:

GET http://localhost:5984/cartoons/_all_docs 
GET http://localhost:5984/test_db_cartoon 
{ error: 'not_found', reason: 'no_db_file' } 
PUT http://localhost:5984/test_db_cartoon 
{ total_rows: 7, 
    offset: 0, 
    rows: 
    [ { id: 'Batman', key: 'Batman', value: [Object] }, 
    { id: 'Donald Duck', key: 'Donald Duck', value: [Object] }, 
    { id: 'Iron Man', key: 'Iron Man', value: [Object] }, 
    { id: 'Mickey Mouse', key: 'Mickey Mouse', value: [Object] }, 
    { id: 'Spider-Man', key: 'Spider-Man', value: [Object] }, 
    { id: 'Superman', key: 'Superman', value: [Object] }, 
    { id: '_design/select', key: '_design/select', value: [Object] } ] } 
{ ok: true } 
PUT http://localhost:5984/test_db_cartoon/Donald+Duck 
{ ok: true, 
    id: 'Donald Duck', 
    rev: '1-1c431dfb2c46991ec999743830a5363b' } 
GET http://localhost:5984/test_db_cartoon/Donald+Duck 
{ _id: 'Donald Duck', 
    _rev: '1-1c431dfb2c46991ec999743830a5363b', 
    publisher: 'Walt Disney' } 

    100% 2 tests 

pueden ampliar fácilmente con la prueba adicional

exports.testname = function(beforeExit, assert) { 
} 
Cuestiones relacionadas