如何使用具有自定义操作的$ resource模拟angularJS服务?

时间:2017-01-30 21:24:00

标签: angularjs unit-testing

https://docs.angularjs.org/api/ngResource/service/ $资源 从$ resource的API我们知道可以调用$ resource方法中的自定义操作。我的问题是,如何模拟具有此自定义操作的服务?

例如,BaseService代码如下:

angular.module('shared').factory('BaseService', function($resource) {
    var resourceConfig = {
        serverBaseUrl: AJAXConfig.ajaxUrl+"&resource_id="
    };

    var createResource = function(url, paramDefaults, actions) {
        return $resource(resourceConfig.serverBaseUrl + url, 
            paramDefaults, actions);
    };

    return {
        createResource: createResource
    };
});

依赖于BaseService的另一个TopService就像:

angular.module('SomeModule').factory('TopService', 
    function($resource, BaseService) {

    var listResource = BaseService.createResource('onSomeList', 
        null, {
            getList: {
            method: 'GET',
            isArray: true
            }
        });

    var getSomeList = function() {
        return listResource.getList().$promise;
    };

    return { getSomeList : getSomeList };
}

现在我需要编写TopService的单元测试代码,所以我使用$ provide:

模拟BaseService
module(function($provide) {
    $provide.service('BaseService', function($q) {
        ....
    }
}

我可以使用模拟createResource方法     jasmine.createSpy(' createResource')。and.callFake(...) 但是如何模拟自定义动作getList()?

更新:我意识到listResource可以简化为:

        var listResource = BaseService.createResource('onSomeList', 
        null, {
            get: {
            method: 'GET',
            isArray: true
            }
        });

因此,自定义操作有一个标准名称" get",但我仍然不知道如何在测试代码中模拟它。

2 个答案:

答案 0 :(得分:0)

我会这样做

#include <iostream>
#include <algorithm>
using namespace std;
bool HasValue(int number, long length, int arr[], bool finalResult);
int main(int argc, const char* argv[])
{

    int num, arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    bool result;
    auto array_length = end(arr) - begin(arr); //size of array
    cout << "enter number: ";
    cin >> num;
    HasValue(num, array_length, arr, result);
    cout << result << "\n";

    return 0;
}
bool HasValue(int number, long length, int arr[], bool finalResult)
{

    int* end = arr + length;
    int* result = find(arr, end, number);
    if (result != end)
        finalResult = true;
    else
        finalResult = false;

    return finalResult;
}

答案 1 :(得分:0)

您不需要模拟资源。你需要模拟服务。不要在测试顶部创建shared,而是创建YourMocks

YourMocks可能如下所示:

angular.module('YourMocks, [])
.factory('TopService', function($q) {
   return {getSomeList: function(){$q.when('your test data goes here')};
});