coffeescript stubbing sinon buster.js

coffeescript - sinon stub para window.location.search



stubbing buster.js (2)

Estoy intentando probar una función simple que hace una llamada a window.location.search. Intento entender cómo rescindir esta llamada para poder devolver una url de mi elección.

función:

getParameterByName: (name) => name = name.replace(/[/[]/, "///[").replace(/[/]]/, "///]") regexS = "[//?&]" + name + "=([^&#]*)" regex = new RegExp(regexS) results = regex.exec(window.location.search) //Stub call to window.location.search if(results == null) return "" else return decodeURIComponent(results[1].replace(//+/g, " "))

Caso de prueba:

describe "Data tests", () -> it "Should parse parameter from url", () -> data = new Data() console.log("search string: " + window.location.search) //prints "search string:" window.location.search = "myUrl" console.log("search string: " + window.location.search) //prints "search string:" console.log(data.getParameterByName(''varName'')) expect(true).toBe(true)

Mi intento original fue devolver un valor directamente así:

sinon.stub(window.location.search).returns("myUrl")

Esto, por supuesto, no funciona. No creo que esté especificando el apéndice correctamente, pero muestra mi intención.

Cualquier idea sobre cómo resolver esto sería muy apreciada.


Entonces, como se mencionó anteriormente, no se puede fingir window.location directamente. La idea del wrapper mylib.search tampoco funcionó con mi situación. Entonces, lo que hice fue romper mi llamada a window.location.search en su propia función. Mi nueva clase parece así:

getParameterByName: (name) => console.log("name: #{name}") name = name.replace(/[/[]/, "///[").replace(/[/]]/, "///]") regexS = "[//?&]" + name + "=([^&#]*)" regex = new RegExp(regexS) results = regex.exec(@getWindowLocationSearch()) if(results == null) return "" else return decodeURIComponent(results[1].replace(//+/g, " ")) getWindowLocationSearch:() => window.location.search

Luego, en mi caso de prueba, reemplazo la función con mi código de prueba así:

describe "Data tests", () -> it "Should parse parameter from localhost url", () -> goodUrl = "http://localhost:3333/?token=val1" Data::getWindowLocationSearch = () -> return goodUrl unit = new Data() result = unit.getParameterByName("token") expect(result).toBe("val1")

Para aquellos que no leen Coffeescript, el código javascript equivalente se detalla a continuación:

it("Should parse parameter from localhost url", function() { var goodUrl, result, unit; goodUrl = "http://localhost:3333/?token=val1"; Data.prototype.getWindowLocationSearch = function() { return goodUrl; }; unit = new Data(); result = unit.getParameterByName("token"); expect(result).toBe("val1"); return expect(true).toBe(true); });

Como es mi experiencia habitual con Javascript. La solución de trabajo no fue tan dolorosa como el viaje para llegar allí. Muchas gracias por sus comentarios y contribuciones.


ACTUALIZACIÓN: window.location , al parecer, es un caso un tanto especial, consulta esta discusión: https://groups.google.com/forum/?fromgroups#!topic/sinonjs/MMYrwKIZNUU%5B1-25%5D

La forma más fácil de resolver este problema es escribir una función de envoltura alrededor de window.location y resguardar eso:

mylib.search = function (url) { window.location.search = url; };

Y en tu prueba:

sinon.stub(mylib, ''search'').returns("myUrl")

RESPUESTA ORIGINAL:

Prueba esto:

sinon.stub(window.location, ''search'').returns("myUrl")