사용자가 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')
라고 불렀다. 이것은 실패한 테스트에서 누락 된 것과 동일한 번역 값이며 올바른 번역을 얻는다. 그래서 나는 왜 시험이 실패하는지 정말로 확신하지 못한다.