¿Cómo puedo stub/burlarse de una función en javascript espacio de nombres global

Estoy tratando de stub/simulacros/reemplazar una llamada de función durante las pruebas de que escribe un registro de una base de datos.

function logit(msg) {
  writeMessageToDb(msg);
}

function tryingToTestThisFunction(){
  var error = processSomething();
  if (error) {
    logit(error);
  }
}

Me gustaría logit() simplemente imprimir en la consola durante la prueba…y haciendo un «isTesting()» if/else bloque dentro de la logit() función no es una opción.

Es esto posible sin incluir algunas otras burlándose de marco. Actualmente estoy usando JsTestDriver para la unidad de pruebas y no han tenido la oportunidad de evaluar cualquier simulacro marcos. Una solución ideal en el momento de manejar esto sin otro marco.

InformationsquelleAutor tjjava | 2010-12-20

6 Kommentare

  1. 7

    Yo uso el Jazmín y Sinon.js (el uso de Coffeescript), esto es lo que yo punta de la confirm() método para, por ejemplo, acabo de volver de verdad.

    beforeEach ->
      @confirmStub = sinon.stub(window, 'confirm')
      @confirmStub.returns(true)
    
    afterEach ->
      @confirmStub.restore()
    • Este caso es diferente, ya Ventana.confirm() no es una función global.
  2. 2

    He estado trabajando en exactamente el mismo problema. Los desarrolladores me dio una app HTML5 para probar, así que por supuesto yo no puede cambiar su código para la prueba. Decidí usar qunit y sinon, junto con sinon-qunit.

    Para un newb a JavaScript unidad de prueba como yo, me estaba volviendo loco con la sinon documentación y varios ejemplos en la web, como la mayoría de ella parece una implícita medio ambiente que no se menciona. El código siguiente es una página completa, así que espero que no queda nada para la confusión.

    La función que tengo que llamar es caller() y yo no puedo hacer nada acerca de stubme() porque es el desarrollador del código. Sin embargo, puedo agregar sinonstub() en mi código de prueba. Pero, ¿cómo llegar a trabajar con sinon? La sinon documentación realmente me confundió por un tiempo, pero a continuación es la solución simple. El stub4stubme objeto puede ser usado para el control de la punta de la acción, y también obtener la información sobre lo que sucede con la punta de llamadas.

    <!DOCTYPE html>
    
    <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="utf-8" />
        <title></title>
        <link rel="stylesheet" href="qunit-1.12.0.css" type="text/css" media="screen" />
    </head>
    <body>
        <div id="qunit"></div>
        <div id="qunit-fixture"></div>
        <script src="sinon-1.7.3.js"></script>
        <script src="qunit-1.12.0.js"></script>
        <script src="sinon-qunit-0.8.0.js"></script>
        <script>
    
            //Dev code in another file
            function stubme() {
                return "stubme";
            }
    
            function caller() {
                return "caller " + stubme();
            }
            //End of dev code
    
            var sinonstub = function () {
                return "u haz bin stubbed";
            };
    
            test("Stubbing global environments", function () {
                equal(caller(), "caller stubme");
    
                var stub4stubme = this.stub(window, "stubme", sinonstub);
    
                equal(caller(), "caller u haz bin stubbed");
                ok(stubme.called);
            });
    
        </script>
    </body>
    </html>
    • Has casi metió su dedo en mi confusión. Sinon.talón(ventana, «stubme», sinonstub); ¿por Qué es la «ventana» en la parte superior de nivel de objeto nombre? Está pasando algo aquí acerca de la variable global de medio ambiente, que en su ejemplo es el llamado de la ventana ya que se ejecuta en una ventana. Pero el cartel original podría ser en Node.js o,…. por lo tanto, es todavía «la ventana», entonces?
  3. 1

    usted puede simplemente reemplazar el método en el objeto de la ventana? En Chrome consola funciona esto

    function test() {console.log('test')};
    window.test();
  4. 1

    acaba de anular la función logit, esto puede ser llamado en cualquier momento más tarde que logit se define.

    (function(){
      //keep handle to original logit method.
      var ol = logit;
    
      //shorter lookup path for slice
      var s = Array.prototype.slice;
    
      //logit override
      logit = function() {
        //if in testing
        if (typeof IsTesting == "function" && !!IsTesting()) {
          //log the arguments
          console.log.apply(console, s.call(arguments));
        } else {
          //otherwise, call the original function.
          ol.apply(this, s.call(arguments))
        }
      }
    }());
    • NOTA: puede especificar «msg» como un paramater y pasar directamente, el s.llame al(argumentos) con .aplicar el método pasará a través de todo lo que funciona mejor para el método anula como este.
  5. 0

    Porque en Javascript no es sólo tiempo de ejecución vinculados, pero la última palabra gana vinculado, solo se que el método con el comportamiento que usted quiere en su prueba:

    function yourTest(){
        oldImpl = logit;   //better to use a setup.
        logit = function(msg){ Console.log.apply(console, s.call(arguments));};
        //do you assertions: assert.... yada.
    
        logit = oldImpl;  //Do this to keep your test isolated from the others you'll be executing in this test run. Better to use a tear down.
    }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea