.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 将始终解决,那么第一种方法可能足以满足您的场景。
您好,我在尝试实施 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 将始终解决,那么第一种方法可能足以满足您的场景。