Javascript 如何对在依赖项上注册回调的Angular服务进行单元测试?
我有一个AngularJs服务,它依赖于SignalR客户端进行基于推送的更新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
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
如何实现实际的模拟在一定程度上取决于服务的外观。您似乎正在注册一个回调,因此我将使模拟在代理
属性上有一个方法,然后将其参数(您的回调)存储在规范中提供的引用中。然后,您应该可以在需要时简单地调用它。这是我感兴趣的最后一段,您能举个例子吗?谢谢,我对您的代码库了解不多,但添加了一些详细信息,至少可以让您开始学习。