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")