3

jasmine を使用して、Sencha Touch 2 アプリ用の適切なテスト環境をセットアップしたいと考えています。

最初のステップとして、このチュートリアルの最初の 3 つの部分を使用しました。

私の実際の問題は次のとおりです。2 つのクラス (1 つのストアと 1 つのビュー) の 2 つの構成エントリは、メソッドを呼び出したり、メインのアプリ オブジェクトのプロパティをそれぞれ Ext.Viewport オブジェクトで読み取ったりする必要があります。

コンクリート:

1.) ストアの 1 つが、アプリのメイン名前空間 (MyAppName.app.backendUrl) の値を読み取ります。

Ext.define('MyAppName.store.MyStore', {
    extend: 'Ext.data.Store',

    config: {
        model: 'MyAppName.model.MyModel',

        proxy: {
            type: 'ajax',
            url: MyAppName.app.backendUrl + '/data.json',
            reader: 'json'
        },

        autoLoad: true
    }
});

2.) 私のビューの 1 つは、Ext.Viewport でメソッド (Ext.Viewport.getOrientation()) を呼び出します。

Ext.define('MyAppName.view.LoginView', {
    extend: 'Ext.form.Panel',
    alias: "widget.loginview",
    config: {
        title: 'Login',
        items: [
            {
                xtype: 'image',
                src: Ext.Viewport.getOrientation() == 'portrait' ? '../../../img/login.png' : '../../../img/login-small.png',
                style: Ext.Viewport.getOrientation() == 'portrait' ? 'width:80px;height:80px;margin:auto' : 'width:40px;height:40px;margin:auto'
            }
        ]
    }
});

残念ながら、これらの呼び出しが行われたときに両方のオブジェクト (MyAppName と Ext.Viewport) がまだ定義されていないため、これはクラッシュします。これは、テスト セットアップの場合にのみ当てはまります (チュートリアルで概説しているように、テスト専用の特定の app.js があります)。(「通常の」app.js を介して) ブラウザーで実際のアプリを実行すると、この問題は発生しません。

これをどのように修正できますか (つまり、MyAppname.app と Ext.Viewport が既に存在する後にビュー/ストア ファイルが実行されるようにするにはどうすればよいですか)?

どうもありがとう。

4

3 に答える 3

2

Ext.application通常、実行すると単体テスト中には望ましくないビューが開かれることがわかりました。それ以外の場合は、統合テストに挑戦することになるため、Sencha 開発ローダーの使用を避けます。代わりに、Karma を使用して単体テストとアプリケーション クラス ファイルを読み込みます。これらのファイルは、ファイル内で構成しkarma.conf.jsます (以下の例)。

Pivotal Labs の優れた単体テスト チュートリアルの例を採用しました。Karma には Web サーバーが組み込まれているため、最初のチュートリアルで説明されているように、Rails、Rake、または pow は必要ありません。Karma を使用すると、単体テストを IntelliJ IDEA や WebStorm などの Javascript ツールや、https: //saucelabs.com/ などの CI システムやクラウド テストと簡単に統合できることを意味します。また、コード ファイルを監視し、更新時にユニット テストを自動再実行するように構成することもできます。karma-istanbulを使用して、コード カバレッジ分析を実行することもできます。

ここで学んだトリックを使用して、setup.jsファイルで構成されているファイルを実行してkarma.conf.js、単体テストの前にロードします。偽のアプリケーション オブジェクトを作成して、コントローラが自分自身をアプリケーション インスタンスに割り当てることができるようにし、意図的にメソッドを持たないようにしlaunch()ます。また、Pivo​​tal Labs の例の SpecHelper.js コードも含まれています。

// Create (but don't launch) the app
Ext.application({name: 'MyAppName' });

ビュー ユニット テストの質問では、偽のExt.Viewportオブジェクトを作成し、spyOn().andReturn() を追加して、Ext.Viewport.getOrientation()テスト中にビューに必要なメソッドを偽造できます。これは、単体テストが両方のオリエンテーション ケースを簡単にカバーできることを意味します。また、テスト中にプロパティを追加しrenderTo:て、レンダリングされたビューを検査します。

describe("when portrait orientation", function() {
   var view;
   beforeEach(function () {
     if (!Ext.Viewport) Ext.Viewport = {};      
     spyOn(Ext.Viewport, 'getOrientation').andReturn('portrait');
     view = Ext.create('MyAppName.view.LoginView', {
         renderTo: 'jasmine_content'
     }
   }

   it("should render large image", function() { 
      expect(Ext.DomQuery.select('...')).toContain('img/login.png');
   });

   it("should render 80px style", function() {
      expect(Ext.DomQuery.select('...')).toContain('80px');
   });        
});

単体テストを表示します (renderToプロパティの使用方法を説明します)。

以下に示す私のsetup.jsファイルには、SpecHelper.jsここに示すコードが含まれています。renderTo これは、プロパティを使用するために必要です。

コントローラー単体テストでは、コントローラーを偽のアプリケーション インスタンスに接続する方法について説明しています。

setup.jsこのコードは、ここ から Karma 読み込みのトリックを盗みますが、その例とは異なり、開発ローダーの使用を避けています。

Ext.Loader.setConfig({
    enabled: true,                  // Turn on Ext.Loader
    disableCaching: false           // Turn OFF cache BUSTING
});

// 'base' is set by Karma to be __dirname of karm.conf.js file
Ext.Loader.setPath({
    'Ext':  'base/touch/src',
    'MyAppName':   'base/app'
});

// Create (but don't launch) the app
Ext.application({name: 'MyAppName' });

Ext.require('Ext.data.Model');
afterEach(function () {
    Ext.data.Model.cache = {};      // Clear any cached models
});

var domEl;
beforeEach(function () {            // Reset the div with a new one.
    domEl = document.createElement('div');
    domEl.setAttribute('id', 'jasmine_content');
    var oldEl = document.getElementById('jasmine_content');
    if (oldEl) oldEl.parentNode.replaceChild(domEl, oldEl);
});

afterEach(function () {             // Make the test runner look pretty
    domEl.setAttribute('style', 'display:none;');
});

// Karma normally starts the tests right after all files specified in 'karma.config.js' have been loaded
// We only want the tests to start after Sencha Touch/ExtJS has bootstrapped the application.
// 1. We temporary override the '__karma__.loaded' function
// 2. When Ext is ready we call the '__karma__.loaded' function manually
var karmaLoadedFunction = window.__karma__.loaded;
window.__karma__.loaded = function () {};

Ext.onReady( function () {
    console.info("Starting Tests ...");
    window.__karma__.loaded = karmaLoadedFunction;
    window.__karma__.loaded();
});

カルマ.conf.js :

module.exports = function(config) {
    config.set({

        // base path that will be used to resolve all patterns (eg. files, exclude)
        basePath: '',

        // frameworks to use
        // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
        frameworks: ['jasmine'],

        // Don't use Sencha Touch dynamic loading
        files: [
            'touch/sencha-touch-all-debug.js',
            'spec/Setup.js',      // Load stubbed app - does not call app.launch()
            { pattern: 'spec/**/*.js',          watched: true,  served: true, included: true },
            { pattern: 'app/**/*.js',           watched: true,  served: true, included: false},
            // Some class are not loaded by sencha-touch-all-debug.js
            // this tell Karma web server that it's ok to serve them.
            { pattern: 'touch/src/**/*.*',      watched: false, served: true, included: false}
        ],

//        // Use Sencha Touch static 'testing' app.js
//        files: [
//            './build/testing/PT/app.js',
//            './spec/SetUp.js',
//            './spec/**/*.js'
//        ],

        // list of files to exclude
        exclude: [
        ],

        // preprocess matching files before serving them to the browser
        // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
        preprocessors: {
        },

        // test results reporter to use
        // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'
        // available reporters: https://npmjs.org/browse/keyword/karma-reporter
        reporters: ['progress'],

        // web server port
        port: 9876,

        // enable / disable colors in the output (reporters and logs)
        colors: true,

        // level of logging
        // possible values: config.LOG_DISABLE/.LOG_ERROR/.LOG_WARN/.LOG_INFO/.LOG_DEBUG
        logLevel: config.LOG_INFO,

        // enable / disable watching file and executing tests whenever any file changes
        autoWatch: true,

        // start these browsers
        // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
        // Start these browsers, currently available:
        // - Chrome
        // - ChromeCanary
        // - Firefox
        // - Opera (has to be installed with `npm install karma-opera-launcher`)
        // - Safari (only Mac; has to be installed with `npm install
        // karma-safari-launcher`)
        // - PhantomJS
        // - IE (only Windows; has to be installed with `npm install
        // karma-ie-launcher`)
        //browsers: [ 'PhantomJS' ],
        browsers: ['Chrome'],

        // If browser does not capture in given timeout [ms], kill it
        captureTimeout: 60000,

        // Continuous Integration mode
        // if true, Karma captures browsers, runs the tests and exits
        singleRun: false
    });
};
于 2014-09-29T00:59:42.073 に答える