Unit testing 向余烬试验中注入服务
我已经阅读并遵循了,但我仍然无法找出问题所在 我想测试我的身份验证是否按预期工作。我已经为ember simple auth编写了验证器,会话被注入到路由中。代码本身工作没有任何问题Unit testing 向余烬试验中注入服务,unit-testing,ember.js,ember-testing,Unit Testing,Ember.js,Ember Testing,我已经阅读并遵循了,但我仍然无法找出问题所在 我想测试我的身份验证是否按预期工作。我已经为ember simple auth编写了验证器,会话被注入到路由中。代码本身工作没有任何问题 export default Ember.Route.extend({ authManager: Ember.inject.service('session'), ... (in actions): this.get('authManager').invalidate() 现在,我想创建一个测
export default Ember.Route.extend({
authManager: Ember.inject.service('session'),
...
(in actions):
this.get('authManager').invalidate()
现在,我想创建一个测试,它将测试我的身份验证是否如我所期望的那样工作。因此,我希望直接使用authManager
moduleFor('route:index', 'Unit | Route | xyz', {
needs: ['service:session']
});
test('2', function(assert) {
let route = this.subject();
let s = route.get('authManager');
当我打印“s”的内容时,我得到“”。若我将此更改为其他内容,那个么响应是未定义的,这是可以预期的。问题是当我想获取属性“isAuthenticated”或运行“invalidate()”时。在这些情况下,我得到了“未定义”。我做错了什么?在单元测试中,我们更喜欢使用模拟对象而不是服务。在集成测试中,我们可以使用真实的服务而不是模拟 要模拟服务,请在单元测试中执行以下操作:
var stubMyService = Ember.Object.extend({
//This is a mock object, write a code to test component/route!
invalidate: function() {
return 'invalidateCalled';
},
isAuthenticated: function(){
return true;
}
});
要将此模拟对象注入组件/路由,请使用this.subject()
创建,如下所示:
test('2', function(assert){
var component = this.subject({
authManager: stubMyService.create()
});
...
});
从Ember 2.13开始,正确的解决方法是使用
this.register
:
test('my test', function(assert) {
this.register('service:session', Ember.Service.extend({
/* mock code */
}));
let subject = this.subject();
// test code goes here...
}
我的猜测是,您需要使用集成测试来实现这些目的。如果您想编写单元测试,您需要模拟除测试对象本身(在本例中是索引路由)之外的所有内容。我在测试服务时遇到了类似的问题:感谢您的回复,很可能我不够清楚。我想测试注入的服务。该服务的通信被ember mirage模仿,因此没有其他依赖项。这就是为什么模拟服务对我没有帮助的原因。我知道我可以创建一个路由并使用验收测试,而不必担心这些问题,但我想知道。感谢您的回复。这对我来说也适用于服务的单元测试(在我的例子中,服务注入了服务!)这在Ember 2.13中不再起作用,请参见以下RFC: