javascript - Prueba de aplicación brisa
testing jasmine (1)
Wow ... ¡esa es una gran pregunta!
Hay un poco sobre este tema en la documentación . No lo suficiente como para estar seguro.
Supongo que eres bastante nuevo en las pruebas de JavaScript. Si has visto DocCode , sabes que usamos QUnit aquí. Muchos prefieren Jasmine, Mocha o algo más; Solo puedo hablar con QUnit.
El primer paso es aprender QUnit . No es dificil. La introducción de QUnit es buena. Me gusta el mazo de diapositivas de Ben Alhman .
A continuación, practicaría con pequeñas pruebas de su lógica empresarial que NO pasan por alto. Podría ser cualquier lógica interesante en un ViewModel o quizás alguna propiedad calculada en un objeto modelo (entidad).
Puede probar la interacción de una VM con un "DataContext" con bastante facilidad sin pasar por el cable. Cree un "FakeDataContext" e inyéctelo en sus pruebas en lugar de las reales. Alternativamente, podría " parche de mono " el verdadero "DataContext" en lugares estratégicos que lo conviertan en un falso.
Al simular el DataContext, me parece útil aprovechar la capacidad de Breeze para limitar las consultas a la memoria caché local. La memoria caché local sirve como un sustituto en memoria de los datos que, de otro modo, se recuperarían del servidor.
Esto puede ser tan simple como establecer FetchStrategy
de las QueryOptions
predeterminadas del QueryOptions
... quizás así
var queryOptions = new QueryOptions({ mergeStrategy: MergeStrategy.PreserveChanges, fetchStrategy: FetchStrategy.FromCache }); var entityManager = new EntityManager({ serviceName: "yourEndpoint", queryOptions: queryOptions });
Ahora todas sus consultas serán dirigidas a la caché (a menos que tengan una QueryStrategy
explícita propia).
Ahora hazlo útil rellenando el caché con datos de prueba. Hay numerosos ejemplos de entidades falsificadas en DocCode. Aquí hay un ejemplo de un cliente falso:
var testCustomer = manager.createEntity(''Customer'', { // test values CustomerID: testCustomerID, CompanyName: testCustomerName, ... }, breeze.EntityState.Unchanged); // as if fetched from the database
Si necesito los mismos datos de prueba repetidamente, escribo una "Madre de datos" que rellena EntityManager con datos de prueba para mí.
Puedo hacer muchas pruebas de esta manera sin siquiera golpear el servidor. Todo el tiempo estoy trabajando con las entidades de Breeze en JavaScript ... tanto como lo hago en el código de producción. No tengo que aprender una biblioteca burlona o inyectar otra herramienta.
Otro enfoque, más difícil, de menor nivel pero más potente, es reemplazar el adaptador AJAX predeterminado de Breeze por un falso que devuelva los valores JSON de prueba como si provinieran del servidor. Puede utilizar una herramienta como Fiddler para crear JSON falso a partir de instantáneas reales de carga útil. También puede usar este truco para simular el comportamiento de guardar del lado del servidor.
Actualización 3 de mayo de 2013
El ejemplo de DocCode incluye un nuevo TestAjaxAdapter
para simular las respuestas del servidor como acabo de describir. Consulte la pruebaAjaxAdapter.js y vea cómo usarla en testAjaxAdapterTests.js . Esta versión particular de DocCode solo está en GitHub en este momento, pero se publicará oficialmente en el lanzamiento inmediatamente después de v.1.3.2.
... fin de la actualización; volver a la publicación original ...
¿Fingir la transmisión JSON dentro de su adaptador falso AJAX parece demasiado PITA? Divide tus habilidades locas Breeze y escribe un JsonResultsAdapter personalizado para crear esas falsificaciones. Haga que su adaptador falso AJAX devuelva una matriz vacía para cada solicitud de consulta. Luego puede hacer lo que quiera en los métodos extractData
y visitNode
de su JsonResultsAdapter
.
Confío en que es obvio que también puedes falsificar tu controlador del lado del servidor. Por supuesto, sus pruebas seguirán haciendo viajes "por cable" para llegar a ese controlador.
Espero que estas pistas sean suficientes para encaminarte en una dirección satisfactoria.
Actualización 30 de abril de 2013
Breeze necesitará metadatos para hacer su trabajo. Tus metadatos provienen del servidor. Llamar al servidor por metadatos parecería frustrar el propósito de ejecutar pruebas completamente desconectadas.
Tan verdadero. Ahora no soy un riguroso en este punto. No me importa tocar metadatos en el servidor en la parte superior de un módulo de prueba ... exactamente una vez ... y luego ejecutar el resto de mis pruebas sin ir al servidor para metadatos. Pero si eres un purista o simplemente no quieres hacer eso, puedes escribir los metadatos del lado del servidor en un archivo JavaScript en el servidor y cargar esa secuencia de comandos estáticamente en la página HTML del corredor de prueba como cualquier otra secuencia de comandos.
Para ver un ejemplo de esta técnica, consulte App_Data/WriteMetadataScriptFiles.cs
que genera un archivo JavaScript para el modelo de Northwind en la próxima (más adelante en esta semana) v.1.3.2 ejemplo de DocCode. Las pruebas de DocCode cargan archivos de JavaScript dinámicamente con require.js . El archivo de prueba metadataTests.js muestra cómo cargar el northwindMetadata.js generado con require. No tienes que ser tan inteligente si no estás usando require.js .
Nota para sí mismo: escriba algunas muestras que ilustren estas técnicas.
Estoy haciendo una aplicación con durandal, breeze y knockout. Empecé a implementar algunas pruebas. El primer problema que tuve fue decidir qué debería probar y qué no. Sé que debería probar todo, pero no siempre es posible en una pequeña empresa.
Mi segundo problema es cómo puedo probar mis llamadas al servidor. He visto algo de información en la página de brisa sobre las pruebas. También he visto el ejemplo de DocCode. Pero me gustaría saber más opiniones sobre cómo puedo hacer eso.
Mis preguntas son:
- ¿Qué debo probar en las llamadas rápidas?
- Me gustaría probar esto, emulando el back-end. ¿Es posible? ¿Algún ejemplo?
- Cualquier consejo o comentario sería genial