您好,我在尝试实现 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/