2017-09-11 12 views
0

사용자가 ember-select-list 패키지에서 제공하는 드롭 다운을 통해 i18n 설정을 전환 할 수있는 Ember 구성 요소의 수락 테스트를 작성하고 있습니다. 또한 i18n 설정에 ember-i18n 패키지를 사용하고 있습니다. 드롭 다운 구성 요소는 다음과 같습니다ember-i18n 패키지와 관련된 Ember 수락 테스트를 실행할 때 누락 된 번역

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.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'; 

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 설정에 영향을주는 것 같아요.이 테스트가 완료된 후이 설정이 손상되지는 않지만 확실하지는 않습니다.

코드는 여기 - 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 옵션을 선택한 후에도 수락 테스트가 독일어로 기본 설정되어있는 것입니다. 그러나 그것은 다른 게시물에 대한 주제입니다.