jquery unit-testing testing mocking qunit

jquery - Probar una página completa redirigir en qUnit



unit-testing testing (3)

Tengo la siguiente función

var redirect = function() { window.location.href = "http://www.google.com"; }

Quiero probar esta función usando qUnit.

El problema es que cuando invoco el documento HTML en el que se ejecutan mis pruebas, tan pronto como llega a la prueba que llama a redirect() , el navegador carga google.com. Lo que me gustaría hacer es burlar window.location.href de alguna manera para que no se redireccione, y así puedo verificar que se haya establecido en el valor correcto.

Volver a escribir esto de una manera que sería más comprobable sería una respuesta aceptable y es bienvenida. Dado que estoy usando qUnit, algo de magia jQuery sería apropiado, como lo sería una refactorización antigua. Se sugirió agregar un setter personalizado para window.location.href, pero no pude encontrar la manera de hacerlo funcionar.

Por favor, no hay sugerencias de cambiar el comportamiento de mi código.


Así es como terminé resolviéndolo. giggity.navOnChange es la función análoga a redirect en la pregunta original.

Código:

var giggity = giggity || {}; $(document).ready(function() { $("#branches").change(giggity.navOnChange); $("#tags").change(giggity.navOnChange); }); giggity.window = window; giggity.navOnChange = function() { giggity.window.location.href = this.value; };

Código de prueba:

var giggity = giggity || {}; test("giggity.navOnChange", function() { var temp = giggity.window giggity.window = { location: {} }; var mockSelect = { value: "/link/to/some/branch", onChange: giggity.navOnChange } mockSelect.onChange(); equal(giggity.window.location.href, mockSelect.value); giggity.window = temp; // restore mocked variable });

Estoy usando el objeto giggity como un espacio de nombres para mi código. giggity.window variable giggity.window para señalar a la window , e interactuar con la window través de giggity.window . De esta manera, puedo simular fácilmente cualquier manipulación del objeto window . giggity.window a un objeto simulado, llamo a la función que modifica giggity.window y giggity.window el valor del simulacro.


No puede modificar window.location.href sin volver a cargar la página. Pero si desea probar este tipo de funciones, definitivamente requiere un poco de modificación lógica.

Ejemplo 1:

Puedes hacer esto con dos funciones, una puede ser una redirección simple para funcionar de manera similar a la tuya, y la otra puede ser la que tiene la lógica de compilación y url. Me gusta esto:

// this function is so simple that you never need to unit test it var redirectTo = function(url) { window.location.href = url; } // if this function has any logic worth testing you can do that without redirects var buildUrl = function(someParameters) { // .... // here be some logic... // .... return "http://www.google.com"; }

  1. La función redirectTo (url) es tan simple que siempre sabrá que funciona sin pruebas.
  2. La función buildUrl (someParameters) puede contener lógica para construir una URL, y debes probar esto. Y puede probar esto sin redireccionar la página.

Ejemplo # 2:

También puede escribir un cruce entre estos dos:

// don''t test this function as it will redirect var redirect = function() { window.location.href = buildUrl(); } // if this function has any logic worth testing you can do that without redirects var buildUrl = function() { // .... // here be some logic... // .... return "http://www.google.com"; }

El ejemplo anterior tendrá la forma similar a la función original, pero tendrá la función lógica de creación de URL que realmente puede probar.

No es un ejemplo, pero es # 3:

Por otro lado, si no quieres cambiar tu lógica y tienes una función tan simple como esta, no hay problema si simplemente no la pruebas ...


Lo que está buscando hacer se hace mejor a nivel de prueba de integración o aceptación, no a nivel de prueba unitaria. De lo contrario, terminas con navegadores falsos y luego no estás probando el mundo real y sin probar realmente nada.

Puede abrir e incorporar iframe en el mismo dominio que las pruebas y cargar su código allí. Entonces podrá afirmar con pruebas asíncronas.

Sin embargo, qUnit realmente no parece tener todas las herramientas que necesitaría para eso, así que si está buscando probar más de unas pocas cosas que requieren recargar / navegar, debe usar una herramienta de prueba diferente.

La alternativa que otros carteles han mencionado es burlarse del objeto de ubicación y probar el comportamiento de su código (en lugar del navegador).