模拟AngularJS $资源方法的响应以进行控制器测试

时间:2015-10-15 19:56:36

标签: angularjs unit-testing jasmine angular-resource

我有一个使用服务的控制器(使用$ resource),我试图模拟服务方法的响应。 虽然我已经成功地模拟了服务方法,包括对该方法的响应,但是控制器中的回调(我试图测试的代码片段,永远不会被调用)。

这是我的嘲笑。

var props = [
   { Uid: "123", Name: "Prop 1" },
   { Uid: "456", Name: "Prop 2" },
   { Uid: "789", Name: "Prop 3" }
];
var mockPropertyService;
beforeEach(inject(function ($q) {
    mockPropertyService = {
        query: function () {
            return $q.when(props);
        }
    };
}));

然后我将我的模拟服务注入我的控制器,这肯定是有效的。

        var controller = $controller("PropertiesCtrl", { $scope: scope, Property: mockPropertyService});
        $rootScope.$apply();
        expect(.......)

查询方法在模拟服务上可用,并且在下面的代码中在控制器中成功调用。但是没有调用响应回调函数。

这是我试图测试的控制器代码

    $scope.loadProperties = function () {
    return Property.query({ embed: 'models' }, function (properties) {
        //I am trying to test this code in here
        //But the test execution never gets to here
        //but it also doesnt throw an exception
        console.log(properties);
        _.each(properties, function (p) {
            p.PictureUrl = p.getThumbnailUrl();
            p.Calculated = p.isCalculated();
            p = Property.loadWorkflows(p);

        });
    });
};

从来没有调用回调函数我做错了什么?

任何人都可以帮助或建议我 - 我已经尝试了我能想到的一切。

1 个答案:

答案 0 :(得分:1)

问题在于我期望mock能够访问从未在模拟本身上定义的回调函数。我已经重新定义了下面的模拟,它就像一个魅力!

beforeEach(inject(function ($q) {
    mockPropertyService = {
        query: function (params, callback) {
            callback(props); //$q.when(workflows);
            return props;
        }

    };
}));

我也不再回复承诺,因为这个例子没有必要