javascript - .then() 中的 Expect() - Jasmine 单元测试,AngularJS

标签 javascript angularjs jasmine

您好,我在尝试实现 jasmine 单元测试时遇到 .then() 函数问题。 这是我的代码:

describe("getBuilding", function () {
  it("checks getBuilding", function () {
    var id_building = 4;
    LocalDB.getTestData();
    LocalDB.getBuilding(id_building).then(function (result) {
      expect(result.name).toMatch("Something");
    });
  });
});

在这种情况下,结果变量在 then() 函数中具有正确的值,但 Expect 在这里不起作用。如果我将“某事”更改为“其他事”,测试仍然会成功,尽管它不应该成功。

我尝试这样解决:

describe("getBuilding", function () {
  it("checks getBuilding", function () {
    var id_building = 4;
    LocalDB.getTestData();
    expect(LocalDB.getBuilding(id_building).name).toMatch("Something");
  });
});

describe("getBuilding", function () {
  it("checks getBuilding", function () {
    var finalResult;
    var id_building = 4;
    LocalDB.getTestData();
    LocalDB.getBuilding(id_building).then(function (result) {
      finalResult=result.name;
    });
    expect(finalResult).toMatch("Something");
  });
});

但是在这两种情况下,匹配的值都是未定义的。有人可以给一些建议吗?

最佳答案

您的“then()”可能根本没有运行 - 由于 promise 是异步解决的,您需要确保在退出测试之前解决 promise ,或者使用 Jasmine 异步来确保 Jasmine 等待异步在继续下一个测试之前解决的方法。

在带有 Promise 的单元测试中,通常您需要手动通知 AngularJS 生命周期,是时候解决 Promise 了。

尝试引入 $rootScope 依赖项,并在测试结束时添加对 $rootScope.$digest() 的调用。

describe("getBuilding", function () {
  it("checks getBuilding", function () {
    var id_building = 4;
    LocalDB.getTestData();
    LocalDB.getBuilding(id_building).then(function (result) {
      expect(result.name).toMatch("Something");
    });
    $rootScope.$digest();
  });
});

如果这本身不起作用,您可能还需要使用 Jasmine Async

describe("getBuilding", function () {
  it("checks getBuilding", function (done) {
    var id_building = 4;
    LocalDB.getTestData();
    LocalDB.getBuilding(id_building).then(function (result) {
      expect(result.name).toMatch("Something");
      done();
    }, function(){
      done.fail('The promise was rejected');
    });
    $rootScope.$digest();
  });
});

使用done的 Jasmine 异步方式是一个更好的测试,因为如果promise被拒绝,它就会失败。如果 promise 被拒绝,第一个任务就会悄然过去。但是,如果您知道这个特定的 promise 总是会解决,那么第一种方法可能足以满足您的场景。

关于javascript - .then() 中的 Expect() - Jasmine 单元测试,AngularJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33418026/

相关文章:

javascript - AngularJS动态调用函数

javascript - 如何在单击按钮时更改 View /模型?

angularjs - 如何编写预计在 $broadcast 后抛出错误的测试

JavaScript:Jasmine 错误:预期 { 0 : HTMLNode, length : 1 } 为 '#containers'

javascript - React 中部分但不是全部获取数据未定义

c# - 如何使用 javascript 在 LinkBut​​ton 模式下触发 BulletedList?

javascript - Angular cookie 在不同的 url 不返回相同的值

javascript - 监听游戏 handle 连接和输入

javascript - 在 ng-repeat 列表中显示和隐藏按钮

javascript - 如何在不重定向的情况下测试javascript重定向?