2017-09-11 5 views
0

Emberコンポーネントの受け入れテストを書いています。ember-select-listパッケージで提供されているドロップダウンを使ってi18n設定を切り替えることができます。また、i18nの設定にはember-i18nパッケージを使用しています。ドロップダウンコンポーネントは次のようになります。これで、これまで私が持っているもの、受け入れテストのためにember-i18nパッケージに関連するEmber受け入れテストを実行しているときに「翻訳が見つかりません」

import Ember from 'ember'; 

export default Ember.Service.extend({ 

    i18n: Ember.inject.service(), 
    config: Ember.inject.service(), 

    setSessionI18nPreference() { 
    let setSessionI18n = (results) => { 
     let { preferences, userName } = results; 
     if (userName && preferences[userName]) { 
     this.set('i18n.locale', preferences[userName].i18n); 
     } 
    }; 
    this._fetchUserPreferencesDB().then(setSessionI18n); 
    }, 

    setUserI18nPreference(i18n) { 
    let setUserI18n = (results) => { 
     let { preferences, userName } = results; 
     if (preferences[userName] === undefined) { 
     preferences[userName] = {}; 
     } 
     preferences[userName].i18n = i18n; 
     this.get('config.configDB').put(preferences); 
     this.set('i18n.locale', i18n); 
    }; 
    this._fetchUserPreferencesDB().then(setUserI18n); 
    }, 

    _fetchUserPreferencesDB() { 
    let configDB = this.get('config.configDB'); 
    let userName; 
    return configDB.get('current_user').then((user) => { 
     userName = this._fetchUsername(user); 
     let preferences = configDB.get('preferences'); 
     return Ember.RSVP.hash({ userName, preferences }); 
    }).catch((err) => { 
     console.log(err); 
     if (err.status === 404) { 
     this._initPreferencesDB(userName, 'en'); 
     } 
    }); 
    }, 

    _fetchUsername(user) { 
    switch (typeof user.value) { 
     case 'string': 
     return user.value; 
     case 'object': 
     return user.value.name; 
     default: 
     return undefined; 
    } 
    }, 

    _initPreferencesDB(username, i18n) { 
    let doc = { 
     _id: 'preferences' 
    }; 
    if (username != undefined) { 
     doc[username] = { 
     i18n: i18n || 'en' 
     }; 
    } 
    this.get('config.configDB').put(doc); 
    } 
}); 

import Ember from 'ember'; 
import { module, test } from 'qunit'; 
import startApp from 'hospitalrun/tests/helpers/start-app'; 

module('Acceptance | language dropdown', { 
    beforeEach() { 
    this.application = startApp(); 
    }, 

    afterEach() { 
    Ember.run(this.application, 'destroy'); 
    } 
}); 

test('setting a language preference persists after logout', (assert) => { 
    runWithPouchDump('default',() => { 
    authenticateUser({ name: 'foobar', prefix: 'p2' }); 
    visit('/'); 

    andThen(() => { 
    assert.equal(currentURL(), '/'); 
    assert.equal(find('.view-current-title').text(), 'Welcome to HospitalRun!'); 
    }); 
    andThen(() => { 
     click('a.settings-trigger'); 
     waitToAppear('.settings-nav'); 
     // andThen(() => { 
     // select('.language-dropdown', 'French'); 
     // andThen(() => { 
     //  debugger; 
     // }); 
     // }); 
    }); 
    }); 
}); 

この作品

import Ember from 'ember'; 

export default Ember.Component.extend({ 
    i18n: Ember.inject.service(), 
    languagePreference: Ember.inject.service(), 

    classNames: ['language-dropdown'], 

    languageOptions: Ember.computed('i18n.locale', function() { 
    let i18n = this.get('i18n'); 
    return i18n.get('locales').map((item) => { 
     return { 
     id: item, 
     name: i18n.t(`languages.${item}`) 
     }; 
    }); 
    }), 

    onFinish: null, 

    actions: { 
    selectLanguage(i18n) { 
     this.get('languagePreference').setUserI18nPreference(i18n); 
     this.get('onFinish')(); 
    } 
    } 

}); 

language-preferenceサービスは、このようになります。すべてのテストが合格します。私は現在、コメントしていますブロックを解除コメント、およびテストを再実行したときしかし、私はグローバルエラーで始まる、複数のテストの失敗を参照してください。

not ok 66 PhantomJS 2.1 - Global error: Error: Missing translation: navigation.subnav.textReplacements at http://localhost:7357/assets/tests.js, line 12058 
--- 
    Log: | 
     { type: 'error', 
      text: 'Error: Missing translation: navigation.subnav.textReplacements at http://localhost:7357/assets/tests.js, line 12058\n' } 
... 
not ok 67 PhantomJS 2.1 - Acceptance | language dropdown: setting a language preference persists after logout 
--- 
    actual: > 
     null 
    expected: > 
     null 
    stack: > 
     http://localhost:7357/assets/tests.js:12058 
    message: > 
     Error: Missing translation: navigation.subnav.textReplacements 
    Log: | 
... 

アプリは私のブラウザでは正常に動作します(翻訳ファイルがすべて整っていて、i18nを切り替えるときにブラウザーに正しいi18n出力が表示されます)。 ember-i18nドキュメントでは、このテストで行われるstartApp()を呼び出すテストで問題なく動作するはずです。私には奇妙な点は、コメントアウトされた行は、コメントを外すとこのテストだけでなく他のファイルもテストすることです。私はいくつかのグローバル(テストプロセス内)i18nの設定に影響を与えていると思っていますが、このテストが終了した後はこの設定は引き裂かれませんが、わかりません。

コードはhere- https://github.com/richiethomas/hospitalrun-frontend/tree/debug

最新のコミットが住んでいる失敗のテストを表します。

編集:私はlanguage-preference内部_fetchUserPreferencesDB機能でデバッガを置くとき、私はthis.get('i18n.locales')を呼び出すと、私は期待してロケールを見ることができるので、私は原因が異なる環境(test対すなわちdevelopment)で異なるロケールではありません知っています。私もthis.get('i18n').t('navigation.subnav.textReplacements')と呼ばれています。これは失敗したテストには欠けていると言われるのと同じ翻訳値であり、正しい翻訳が得られます。だから、なぜテストが失敗するのか本当に分かりません。

答えて

0

ドイツ語の翻訳ファイル(navigation.subnav.textReplacementsキーを持たない)を使用しようとしていたようですが、受け入れテストでフランス語が指定されていました。私は、Chromeコンソールでテストを実行し、失敗した行の直前にデバッガを置き、this.get('i18n._locale')オブジェクトのtranslations属性を調べることでこれを確認しました。私は彼らが何らかの理由でドイツ語ですべてであることを発見しました。

欠けている翻訳要素の謎は、本当に別の謎を隠していたので、PhantomJSがフランスのi18nオプションを選択した後でも、私の受け入れテストがデフォルトになっています。しかし、それは別の投稿の話題です。

関連する問題