2012-06-26 12 views
11

Estoy tratando de hacer pruebas sin cabeza de mis modelos de vista nocaut. Evito deliberadamente tratar con cualquier construcción ui en mi modelo de vista y dejar el cableado a la página html.Prueba de modelo de vista sin golpear sin cabeza con mocha

Esto funciona muy bien en Jasmine ya que se ejecuta en el navegador, pero cuando cambio a mocha, que terminan corriendo de cabeza en la última línea de nocaut que es:

}) (ventana, documento, navegador);

He mirado en el uso de zombiejs lo que sería una buena alternativa, pero no veo una buena historia sobre cómo utilizarlo sin necesidad de cambiar la fuente nocaut en sí.

¿Alguna idea sobre cómo abordar esto?

+0

¿Qué características del nocaut usted necesitan en sus modelos de vista?Si solo son los observables, simulémoslos e ignoremos el resto de los knockout durante la prueba de la parte de VM. – Niko

+0

El problema es que incluso con la versión de depuración, la inicialización de los errores de la secuencia de comandos knockout.js (v2.1.0) en una llamada a navigator.userAgent. Por lo tanto, no puedo llegar al punto de probar el modelo de vista y las partes observables/computadas/pubsub. –

+0

Creo que zombie será tu mejor esfuerzo ya que simula el dom. Knockout se escribió como un archivador DOM-Model, no como un archivador genérico. Quizás la red troncal esté más alineada con su estilo de desarrollo. Glue.js es también una buena carpeta de eventos. –

Respuesta

3

Este es un tema actualmente en mi radar también. Voy a arrojar mis conclusiones aquí con la esperanza de que puedan señalarle la dirección correcta.

La ruta más probable que intentaré primero será PhantomJS. Es un navegador WebKit sin cabeza, por lo que debe contar con excelentes selectores de DOM, JSON, HTML5 y CSS (por ejemplo, works with jQuery and qUnit).

yo elegimos este porque se utiliza por sí mismo knockout.js, que he descubierto en el repositorio knockout.js, donde había un archivo .travis.yml y este comentario:

enter image description here

I no tiene ninguna prueba de que esto vaya a funcionar, pero fue alentado por su uso en el núcleo de knockout.js. También encontré this runner script for knockout/phantom que parece un gran punto de lanzamiento.

También he encontrado afewexamples usando Mocha y PhantomJS a través de Node.js, incluyendo this lib extending grunt para funcionar dentro de moka fantasma, y ​​this script showing how to run mocha inside PhantomJS. Entonces esa parte es cierta, al menos.

Otra solución noted in the knockoutjs archives, es utilizar knockout-nodeJsDOM y para crear un DOM viable, pero a primera vista, esto parecía demasiado nebulosa y probable que resulte en la ejecución de su propio entorno de prueba.

Hay un slidedeck suggesting zombie.js que funcionaría con knockout/node/etc. Pero no puedo encontrar nada que ofrezca pruebas contundentes, por lo que tampoco me gustó esta ruta.

+0

He hecho esto con PhantomJS y funciona para mí. YMMV. –

+1

@JohnRayner ¿te importaría publicar una descripción de tu flujo de trabajo? –

0

Quizás esto se deba a que Knockout ha cambiado (ya que la respuesta aceptada es anterior), pero hoy, no creo que sea necesario (nunca más). Puedes probar fácilmente un modelo de vista Knockout. Todo lo que tenía que hacer era establecer la variable global ko en mi prueba:

global.ko = require('../../Website/Scripts/knockout-3.4.0.js'); 

Después de eso, puede ejecutar la prueba como de costumbre: una instancia de su modelo de vista, realizar cualquier operación sobre el mismo y hacer valer.

He escrito a little more al respecto, pero en esencia, esto funciona para mí:

global.ko = require('../../Website/Scripts/knockout-3.4.0.js'); 

var MyViewModel = require('../../Website/Scripts/myViewModel.js').MyViewModel; 

describe('MyViewModel', function() { 
    var viewModel; 

    beforeEach(function(){ 
     viewModel = new MyViewModel(); 
    }); 

    describe('...', function() { 
     /* And so on */ 
    }); 
});