.then() 中的 expect() - 茉莉花单元测试,AngularJS

expect() in .then() - jasmine unit testing, AngularJS

您好,我在尝试实施 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");
    });
  });
});

在这种情况下,result 变量在 then() 函数中具有正确的值,但 expect 在这里不起作用。如果我将 "Something" 更改为 "something else",测试仍然会成功,尽管它不应该。

我试过这样解决的:

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");
  });
});

但在这两种情况下,匹配的值都是未定义的。谁能给点建议吗?

努力return兑现诺言。

return LocalDB.getBuilding(id_building)
    .then(function (result) {
       expect(result.name).toMatch("Something");
    });

根据 :http://jasmine.github.io/2.0/introduction.html#section-Asynchronous_Support

Jasmine 支持异步方法。本质上,您的问题是您在异步调用响应之前断言。因此它没有数据并且您的断言失败。

所以根据上面的 link 你可以做类似的事情(没有测试,我没有使用 jasmine 所以也不能确定我是否正确地遵循了 link。希望你能更好地理解比我).

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

您的 'then()' 可能根本不是 运行 - 因为承诺是异步解决的,您需要确保在退出测试之前解决承诺或使用 jasmine async 来确保茉莉花在继续下一个测试之前等待异步方法解决。

在带有承诺的单元测试中,您通常需要手动通知 angularjs 生命周期该解决承诺的时间到了。

尝试引入 $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 将始终解决,那么第一种方法可能足以满足您的场景。