Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.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 如何对在依赖项上注册回调的Angular服务进行单元测试?_Javascript_Angularjs_Unit Testing_Signalr_Jasmine - Fatal编程技术网

Javascript 如何对在依赖项上注册回调的Angular服务进行单元测试?

Javascript 如何对在依赖项上注册回调的Angular服务进行单元测试?,javascript,angularjs,unit-testing,signalr,jasmine,Javascript,Angularjs,Unit Testing,Signalr,Jasmine,我有一个AngularJs服务,它依赖于SignalR客户端进行基于推送的更新 MyService向信号器代理注册一个函数以处理更新,当信号器服务器调用客户端方法receiveUpdate时调用该函数,如下所示: app.factory('MyService', function ($rootScope, signalRClient) { signalRClient.proxy.on('receiveUpdate', function (update) { $rootScope.$ap

我有一个AngularJs服务,它依赖于SignalR客户端进行基于推送的更新

MyService
向信号器代理注册一个函数以处理更新,当信号器服务器调用客户端方法
receiveUpdate
时调用该函数,如下所示:

app.factory('MyService', function ($rootScope, signalRClient) {

signalRClient.proxy.on('receiveUpdate', function (update) {
    $rootScope.$apply(function () {
        handleUpdate(update);
    });
});

function handleUpdate(update) {
    // ....
}

return {
    getUpdates: function () {
        // ....
    }
}
}))


如何模拟
signalClient
,以便隔离
MyService
中的逻辑?如何假装调用
receiveUpdate
以传入更新对象

我想这有点取决于你如何设置你的规格,我倾向于在每个场景之前加载
中的任何模块,并且会这样做

var myMock;
var receiveUpdate;

beforeEach(module('whateverModuleSignalRClientIsIn', function($provide) {
    myMock = {
        proxy: {
            on: function(id, callback) {
                receiveUpdate = callback;
            }
        }
    };
    $provide.value('signalRClient', myMock);
}));

beforeEach(module('whateverModuleMyServiceIsIn'));

beforeEach(inject(function(MyService) {
    // MyService will not be instantiated untill it has been injected
    // and at this point signalRClient has been replaced with the mock already
}));

it('receives updates', function() {
    //This should trigger the callback in your service
    receiveUpdate({});
});
这将确保您的服务模块加载了模拟版本的
myService


如何实现实际的模拟在一定程度上取决于服务的外观。您似乎正在注册一个回调,因此我将使模拟在
代理
属性上有一个
方法,然后将其参数(您的回调)存储在规范中提供的引用中。然后,您应该可以在需要时简单地调用它。

这是我感兴趣的最后一段,您能举个例子吗?谢谢,我对您的代码库了解不多,但添加了一些详细信息,至少可以让您开始学习。