gpt4 book ai didi

javascript - Angular - 使用 jasmine 测试 websocket 包装器

转载 作者:行者123 更新时间:2023-11-30 16:53:29 25 4
gpt4 key购买 nike

我在测试我的 websocket 包装器时遇到问题:数据服务是我的 Angular 服务,用于包装 native 浏览器 WebSocket 实现。

实现:

angular.module('core').factory('dataService', function ($interval, webSocket) {

var sock;

function openSocket() {
sock = new webSocket('ws://localhost:9988');
}

function isReady() {
return sock.readyState === 1;
}

openSocket();

$interval(function () {
!isReady() && openSocket();
}, 5000);
});

webSocket是window.WebSocket提取到一个 Angular 常量。

测试:

describe('Data Service', function () {

var dataService,
ws;

jasmine.DEFAULT_TIMEOUT_INTERVAL = 15000;

beforeEach(function () {
module('core', function ($provide) {
ws = jasmine.createSpy('constructor');
$provide.constant('webSocket', ws);
});

inject(function (_dataService_) {
dataService = _dataService_;
});
});

it('should attempt to connect on load', function () {
expect(ws).toHaveBeenCalled();
});

it('should attempt to reconnect every 5 seconds', function (done) {
setTimeout(function () {
expect(ws.calls.count()).toBe(2);
done();
}, 6000);
});
});

should attempt to connect on load

通过:按预期调用了一次。

should attempt to reconnect every 5 seconds

失败:无论我将什么超时时间传递给 setTimeout,它都只会被调用一次。我想知道这是否是由于套接字在每次使用 new 关键字重新连接尝试时都被重新实例化。我不太了解在 javascript 中使用 new 与使用普通函数构造对象有何不同。

我错过了什么吗?还是浏览器的 WebSocket 测试起来很麻烦?

最佳答案

在测试中避免超时问题的一种方法是通过调用 $interval.flush 强制应用程序时间向前移动使其完全同步

it('should attempt to reconnect every 5 seconds', function () {
$interval.flush(4999);
expect(ws.calls.count()).toBe(1);
$interval.flush(1);
expect(ws.calls.count()).toBe(2);
$interval.flush(4999);
expect(ws.calls.count()).toBe(2);
$interval.flush(1);
expect(ws.calls.count()).toBe(3);
});

然后您可以在几毫秒的挂钟时间内模拟 10 秒的应用程序时间。您可以在 http://plnkr.co/edit/lz2u08JQLGCgGvX3vKQx 上看到它的实际效果

我怀疑为什么原来的不起作用,是测试环境中的 mock implementation of $interval 实际上根本没有调用真正的 Javascript setInterval/setTimeout :它只是提供了 flush 功能来将其向前移动一段模拟的时间。

关于javascript - Angular - 使用 jasmine 测试 websocket 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30132422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com