2013-09-30 25 views
18

JS testleri yazmak istiyorum. Üretim kodu RequireJS ile yazılmıştır. Run bitmiş bir geri arama almak ve test fonksiyonu tamamlandıktan sonra çalıştırır bir işlev oluştururJasmine ve RequireJS ile Squire.js örneği

Squire.js web sitesinden https://github.com/iammerrick/Squire.js/

: Ben Squire.js adında bir test lib bulundu. Asenkronizasyonun bir geri bildirimle işlendiği çerçeveler için özellikle yararlıdır. İşte Mocha.js ile bir örnek. Yasemin Jasmin.Async kullanarak bu geri arama yaklaşımı sunabilir." Ben Yasemin zaman uyumsuz olan bu nasıl kullanılacağını bilmiyorum

. Küçük bir örnek çok faydalı olacaktır.

cevap

21

Bu yerleştirme için güzel kurulumdur . testlerden içine alay bağımlılıkları ile modüller Bu sadece spec görmek istiyorsanız sonuna atlamak, birisi başlamak için örnek sona erdirmek için sonudur

Klasör Yapısı:.

Jasmine 
|-lib 
||-jasmine   -- Contains all the Jasmine files 
|||-boot.js 
|||-jasmine-html.js 
|||-jasmine.js 
|||-jasmine.css 
|||-jasmine_favicon.png 
|||-... 
|-spec    -- Spec files go here 
||-hello-spec.js 
|SpecRunner.html 
|SpecRunner.js 
|squire.js 
Scripts 
|knockout.js 
|require.js 
|jquery.js 
App 
|-hello.js 
|-foo.js 

Sorunuz sırasında Jasmine 1.3 en son versiyondu. O zamandan beri 2.0 yayımlandı ve bazı uyumsuz gelişmeler içeriyordu. Her iki versiyon da buraya dahil edilmiştir, 1.3 yorumlanmıştır.

SpecRunner.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <title>Hello Spec Runner</title> 

    <link rel="shortcut icon" type="image/png" href="lib/jasmine/jasmine_favicon.png"> 
    <link rel="stylesheet" type="text/css" href="lib/jasmine/jasmine.css"> 
</head> 
<body> 
    <!-- Load RequireJS & the testsuite --> 
    <script src="../Scripts/require.js" data-main="SpecRunner.js" type="text/javascript" ></script> 
</body> 
</html> 

SpecRunner.js:

Bu soru Does Jasmine 2.0 really not work with require.js? bu kadar çalışır duruma yardımcı oldu.

(function() { 
    'use strict'; 

    // Configure RequireJS to shim Jasmine 
    requirejs.config({ 
     baseUrl: "../App", 
     paths: { 
      'jasmine' : '../Jasmine/lib/jasmine/jasmine', 
      'jasmine-html': '../Jasmine/lib/jasmine/jasmine-html', 
      'boot': '../Jasmine/lib/jasmine/boot', // This is not present in Jasmine 1.3 
      'spec' : '../Jasmine/spec', 
      'squire': '../Jasmine/squire', 
      'knockout': '../Scripts/knockout-2.3.0', 
      'jquery': '../Scripts/jquery-1.10.2' // This only used in the Jasmine 1.3 case. 
     }, 
     shim: { 
      'jasmine': { 
       exports: 'jasmine' 
      }, 
      'jasmine-html': { 
       deps: ['jasmine'], 
       exports: 'jasmine' 
      }, 
      'boot': { 
       deps: ['jasmine', 'jasmine-html'], 
       exports: 'jasmine' 
      }, 
      "squire": { 
       exports: "squire" 
      } 
     } 
    }); 

    // Define all of your specs here. These are RequireJS modules. 
    var specs = [ 
     'spec/hello-spec' 
    ]; 

    // Load Jasmine - This will still create all of the normal Jasmine browser globals unless `boot.js` is re-written to use the 
    // AMD or UMD specs. `boot.js` will do a bunch of configuration and attach it's initializers to `window.onload()`. Because 
    // we are using RequireJS `window.onload()` has already been triggered so we have to manually call it again. This will 
    // initialize the HTML Reporter and execute the environment. 
    require(['boot'], function() { 

     // Load the specs 
     require(specs, function() { 

      // Initialize the HTML Reporter and execute the environment (setup by `boot.js`) 
      window.onload(); 
     }); 
    }); 

    /****** 
    * Use this require if you're on Jasmine 1.3 
    ******/ 
    //require(['jquery', 'jasmine-html'], function ($, jasmine) { 
    // var jasmineEnv = jasmine.getEnv(); 
    // jasmineEnv.updateInterval = 1000; 

    // var htmlReporter = new jasmine.HtmlReporter(); 

    // jasmineEnv.addReporter(htmlReporter); 

    // jasmineEnv.specFilter = function(spec) { 
    //  return htmlReporter.specFilter(spec); 
    // }; 

    // $(function() { 
    //  require(specs, function(spec) { 
    //   jasmineEnv.execute(); 
    //  }); 
    // }); 
    //}); 

    // end 1.3 
})(); 

foo.js:

define(['knockout'], function (ko) { 

    var message = ko.observable("Go away, World!"); 

    return { 
     message: message() 
    }; 
}); 

hello.js:

define(['foo'], function (foo) { 

    return { 
     message : foo.message 
    }; 

}); 

Merhaba-spec.js:

define(['squire'], function (Squire) { 

    var injector = new Squire(); 
    var builder = injector 
     .mock('foo', { 
       message: "Hello, World!" 
     }); 

    describe('hello', function() { 
     var hello; 

     beforeEach(function (done) { 
      // For async: 
      // accept a "done" parameter and Jasmine will wait... 
      builder.require(['hello'], function (hi) { 
       hello = hi; 
       done(); // ...until you invoke it. 
      }); 

      /******* 
      * Use the following if you're on 1.3 
      *********/ 
      //var done; 
      //runs(function() { 
      // builder.require(['hello'], function (hi) { 
      //  hello = hi; 
      //  done = true; 
      // }); 
      //}); 

      //waitsFor(function() { 
      // return done; 
      //}, "Unable to load dependency not loaded", 750); 

      // end 1.3 
     }); 

     it('is welcoming', function() { 
      expect(hello.message).toBe("Hello, World!"); 
     }); 
    }); 

    describe('hello no mock foo', function() { 
     var hello; 

     beforeEach(function (done) { 
      // For async: 
      // accept a "done" parameter and Jasmine will wait... 
      require(['hello'], function (hi) { 
       hello = hi; 
       done(); // ...until you invoke it. 
      }); 

      /******* 
      * Use the following if you're on 1.3 
      *********/ 
      //var done; 
      //runs(function() { 
      // require(['hello'], function (hi) { 
      //  hello = hi; 
      //  done = true; 
      // }); 
      //}); 

      //waitsFor(function() { 
      // return done; 
      //}, "Unable to load dependency not loaded", 750); 

      // end 1.3 
     }); 

     it('is less than welcoming', function() { 
      expect(hello.message).toBe("Go away, World!"); 
     }); 
    }); 
}); 

Detaylar

Hatları foo üzerinde

var injector = new Squire(); 
var builder = injector 
    .mock('foo', { 
     message: "Hello, World!" 
    }); 

sahte yukarı Merhaba 's bağımlılık ve alay foo kullanarak sonra

builder.require(['hello'], function (hi) { 
    hello = hi; 
    done(); // ...until you invoke it. 
}); 

yükler merhaba modülü. İkinci testte merhaba yüklenecek şekilde daha gerektirir karşılaştır:

require(['hello'], function (hi) { 
    hello = hi; 
    done(); // ...until you invoke it. 
}); 

Yasemin docs http://jasmine.github.io/ "bitti()" işlevselliği (2.0) ya da "çalışır/waitsFor" (1.3) sizi doldurabilirsiniz.