2017-05-09 70 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()'中解決,那麼你描述的行爲可能會發生。但是,你不能依賴它,因爲它是異步的。也許你可以提供函數的確切代碼? –