Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 附加到AngularJS范围的单元测试承诺_Javascript_Angularjs - Fatal编程技术网

Javascript 附加到AngularJS范围的单元测试承诺

Javascript 附加到AngularJS范围的单元测试承诺,javascript,angularjs,Javascript,Angularjs,AngularJS为您提供的众多魔法之一是自动承诺解析,这样您就可以编写如下代码: function SomeCtrl($scope, Resource) { $scope.items = Resource.query(); } 然而,我正在通过JSON-RPC和ngResource使用的服务似乎不能很好地使用它。我不得不模拟后端以做出适当的响应,但由于某些原因,我似乎无法弄清楚如何在控制器级别测试响应 "use strict"; describe('controllers', fu

AngularJS为您提供的众多魔法之一是自动承诺解析,这样您就可以编写如下代码:

function SomeCtrl($scope, Resource) {
    $scope.items = Resource.query();
}
然而,我正在通过JSON-RPC和ngResource使用的服务似乎不能很好地使用它。我不得不模拟后端以做出适当的响应,但由于某些原因,我似乎无法弄清楚如何在控制器级别测试响应

"use strict";

describe('controllers', function() {

    describe('LibraryCtrl', function() {
        var scope, ctrl;

        beforeEach(inject(function($rootScope, $controller) {

            JsonRpc.respondWith({ some : data });

            scope = $rootScope.$new();
            ctrl = $controller(LibraryCtrl, { $scope : scope }); 
            // controller does `$scope.items = RPCService.get()`
        }));

        it("should create a `items` model with data fetched via JSON-RPC", function() {
            // here's where I'm very confused
            // JsonRpc does $httpBackend.flush()
            JsonRpc.respond();

            // now I want to inspect the property on the controller
            expect(scope.items).toEqualData( { some : data } );
        }); 
    }); 

});
问题是,
scope.items
是一种承诺。该特定属性仍然是一个承诺,因为显然
$digest()
不会解析该承诺并将返回值重新附加为模型值。我不能做一个简单的平等断言

我的解决方法是使用承诺捕获模拟:

var result = {
    capture : function(v) { result.value = v; },
    value   : null,
};
然后试试这个:

scope.items.then(result.capture);
expect(result.value).toEqualData(...);
这确实有效(但感觉有点不对劲)。作为旁注(对于布朗尼点数,这不是实际问题),将
结果.capture
链与
JsonRpc.respond()交换会导致测试失败(其中
结果.value
为null)


以下是问题:测试作为范围模型设置的承诺的正确方法是什么?这是结果吗?我做的事情还可以,还是有更好的方法?另外,我很想知道为什么用响应刷新来反转承诺附件会导致响应无法解析和捕获…?

好问题。我的第一反应是,似乎您的控制器单元测试实际上是在这里测试ngResource。在控制器测试中,我模拟了资源:

mockResource = {query: jasmine.createSpy('query').andReturn([{id: 1, name: foo}])

module(function ($provide) {
   $provide.value('Resource', mockResource);

...

expect(mockResource.find).toHaveBeenCalled()
expect(scope.items)....

这允许您单独测试控制器。

您解决过这个问题吗?我也遇到了同样的问题。我目前正在做一些类似Resource.query().then(function(value){$scope.items=value})的事情来解决这个问题,但这不是很优雅……看啊,这是有道理的。我仍然不满意自动承诺解析以一种我无法轻易重新调整用途的方式发生,但我的测试范围超出了控制器的功能,这确实是有意义的。即使后来我不再使用Angular;),我还是很感激这个答案