测试一个Node.js函数,该函数的返回值可以根据执行异步操作的时刻而改变

Testing a Node.js function whose return value can change depending upon the moment an asynchronous operation is permormed

本文关键字:函数 执行 改变 时刻 异步操作 返回值 一个 js Node 测试      更新时间:2023-09-26

我正在为node-redis模块编写模拟,并使用Jasmine对其进行测试。我为Redis命令的各个方面编写测试,我的目的是能够在原始Redis模块上运行测试。

我的问题是:如果我正确理解node-redis , node-redis的异步函数的返回值是不同的,这取决于命令被发送到Redis或排队稍后发送(例如,在连接完成后发送)。但是我也想测试返回的值,如果我写一个像下面这样的测试:

it("should update value", function () {
  var client = redis.createClient();
  client.set("key", "1st");
  var value = client.get("key", function (err, data) {
    expect(err).toBeNull();
    expect(data).toBe("1st");
  });
  expect(value).toBe(true);
});

如果我使用真正的Redis模块,它将不会通过,因为没有足够的时间连接到数据库。

是否有一种方法可以等待异步请求被执行,然后继续测试代码?

expect(err).toBeNull() == expect(value).toBe(true);,因为异步函数不返回任何值(未定义)。你应该只做

client.set("key", "1st");
client.get("key", function (err, data) {
  expect(err).toBeNull();
  expect(data).toBe("1st");
});

但是如果你想等待,你应该使用这样的语句:

var value = undefined;
client.get("key", function (err, data) {
  expect(err).toBeNull();
  expect(data).toBe("1st");
  value = true;
});
setInterval(function(){ expect(value).toBe(true); }, 10000); // wait 10 seconds for connection