2017-05-09 58 views
1

我有一个函数返回一个有很多方法的对象,我需要检查这个返回对象中的一个方法。我使用AngularJS和Karma + Jasmine作为测试套件。如何在由函数返回的对象中调用方法?测试一个函数返回的对象的方法

function modalOptions() { 
 
    ......... 
 
    return this.$q((resolve) => { 
 
    // test accessable here 
 
    this.solveModel = { 
 
     save:() => { 
 
     // test can't call save() 
 
     this.saveToDB = this.toSendToDB; 
 
     }, 
 
     cancel:() => { ... 
 
     }, 
 
     delete:() => { ... 
 
     } 
 
    }; 
 
    }); 
 
}

我的测试有点像这样...

it('should save modal with the data', function() { 
 

 
    scope.$apply(); 
 
    expect(vm.modalOptions).toBeDefined(); 
 

 
    vm.toSendToDB = true; // hard-coded 
 
    vm.savedToDB = undefined // default value from other controller 
 

 
    spyOn(vm, 'modalOptions').and.callThrough(); 
 
    console.log(vm.modalOptions()); // gives weird response: c{$$state: Object{status: 0}} instead of the solveModal object 
 

 
    expect(vm.toSendToDB).toBeTruthy(); 
 
    expect(vm.savedToDB).toBeTruthy(); 
 

 
});

+0

难道你不需要像'vm.modalOptions()。then(function(value){console.log(value);})'得到solveModal对象吗?因为它返回一个承诺不? – Matthias

+0

实际上这是我正在做的事情,但测试并没有进入当时的通话。后来,我只是保持手动调用功能,它的工作。奇怪,但工作:) – Jamie

回答

0

对不起,我不能评论还,但承诺已经得到解决并将solveModel传递给它,以便solveModel被返回。你在哪里解决承诺?

+0

不知道它如何得到解决,但我可以直接调用'vm.modalOptions()'之前访问'solveModal.save()'。函数没有拒绝,所以我认为它总是用solveModal对象解决(solveModal最初是{})。这甚至有可能吗? – Jamie

+0

[$ q docu](https://docs.angularjs.org/api/ng/service/$q)指出,$ q得到一个函数作为参数,它本身有两个参数:resolve和reject。在你的情况下,拒绝因任何原因被省略,但你可以添加它。在传递给$ q的函数内部,你必须自己调用解析来解决承诺。如果你当然立即在'vm.modalOptions()'中解决,那么你描述的行为可能会发生。但是,你不能依赖它,因为它是异步的。也许你可以提供函数的确切代码? –

相关问题