Jasmine - 多个它,一个异步调用

Jasmine - Multiple it's, one asynchronous call

场景

我试图在单个外部负载上执行多个 it 规范,而不是每次都加载外部数据。

问题

如何在保持我的 it 定义的情况下通过一次调用 getExternalValue 来做到这一点?

想法

目前我正在一个 it 块中完成所有 expect。我也考虑过在测试之前存储加载的值,但是我必须找到另一种方法让 jasmine 等待直到加载值。

代码

function getExternalValue(callback) {
    console.log("getting external value");
    
    setTimeout(function() {
        callback(true);
    }, 2000);

    return false;
}

describe("mjaTestLambda()", function() {
    it("is truthy", function(done) {
        let truthy;
        truthy = getExternalValue(function(bool) {
            truthy = bool;
            expect(truthy).toBeTruthy();
            done();
        });
    });

    it("is falsy", function(done) {
        let truthy;
        truthy = getExternalValue(function(bool) {
            truthy = bool;
            expect(!truthy).toBeFalsy();
            done();
        });
    });
});

How can I do this with a single call of getExternalValue while still keeping my it definitions?

使用beforeEach()beforeAll()获取解析值。我个人建议 beforeEach() 因为它将重置每个测试的值并有助于确保每个测试的干净设置。

我注意到你的函数有一个回调参数。 Async/await 是一种有用的模式,在 (1) 您正在编写 async/await 函数或 (2) 您的函数 return Promise 时效果最佳。如果您需要保留回调参数,请告诉我,我将更新以下内容:

// returns Promise
function getExternalValue() {
  return new Promise((resolve, reject) => {
    console.log("getting external value");
    setTimeout(() => {
      resolve(true);
    }, 2000);
  });
}

describe("mjaTestLambda()", () => {

    let value;

    beforeAll(() => {
      return getExternalValue()
        .then((v) => { value = v; });
    });

    it("is truthy", () => {
      expect(v).toBeTruthy();
    });

    it("is not falsy", () => {
      expect(!v).toBeFalsy();
    });
});