Jasmine angular 单元测试'无法读取未定义的 'property'
Jasmine angular unit test 'Cannot read 'property' of undefined
我刚开始学习angular单元测试。但是,此对带有 http 调用的函数的测试失败。我已经指出了问题,但是我无法解决它。我知道这是一些简单的问题
控制器
//Get data from URL
vm.getJson = function() {
var url = 'https://www.reddit.com/r/worldnews/new.json',
count = 0;
$http.get(url).success(function(response) {
console.log(response);
for (var i = 0; i < response.data.children.length; i++) {
vm.data.push(response.data.children[i].data);
count++;
if (count === response.data.children.length) {
vm.numberOfPages();
}
}
vm.result = true;
}).error(function(err) {
console.log(err);
});
};
我得到的回复是:
规格
//Testing the getJson function
describe('vm.getJson()', function() {
it('It should return dummy Data as response and vm.result to be truthy', function() {
var dummyData = {name: 'Umair'};
$httpBackend.whenRoute('GET','https://www.reddit.com/r/worldnews/new.json').respond(200, dummyData);
MainCtrl.getJson();
$httpBackend.flush();
expect(MainCtrl.result).toBeTruthy();
}); });
如果我从控制器函数中删除循环,我没有收到任何错误并且测试通过。我得到的错误是:
无法读取未定义 的 'Children'。从我附上响应数据的图像来看,children 是数组。
你的 dummyData 不是数组,我想这可以解决问题,请尝试下面的测试
//Testing the getJson function
describe('vm.getJson()', function() {
it('It should return dummy Data as response and vm.result to be truthy', function() {
var dummyData = [{ data: 'Umair' }];
$httpBackend
.when('GET', 'https://www.reddit.com/r/worldnews/new.json')
.respond(.respond(
function() {
return [200, dummyData, {}];
}););
MainCtrl.getJson();
$httpBackend.flush();
expect(MainCtrl.result).toBeTruthy();
});
});
您在测试中返回了一个带有 属性 name
的对象,然后您试图访问未定义的 属性 data
。
您应该在测试中模拟一个真实的响应对象,例如:
var dummyData = {
data: {
children: [
{ data: 'foo'}
]
}
};
当您的测试是 运行 时,$httpBackend 实际上会拦截 $http.get
调用并将 dummyData
分配给您在
中指示的响应
$httpBackend.whenRoute('GET','https://www.reddit.com/r/worldnews/new.json').respond(200, dummyData);
这种模拟行为允许您快速完成单元测试,而不依赖于从您的测试机器访问 reddit。因此,在您的控制器中,response.data = {name: 'Umair'}
并且该对象没有名为 children
.
的子对象
要解决这个问题,dummyData
尝试多模仿一下真实数据。
您应该在组件范围内定义未定义的变量:
beforeEach(async () => {
fixture = TestBed.createComponent(ExportWizardComponent);
component = fixture.componentInstance;
// DEFINE VALUES FOR VARIABLES
component.patientInfo = Constants.PROJECT_WIZARD_INFO;
component.wizardMove = of(null);
fixture.detectChanges();
});
it('should create', async () => {
expect(component).toBeTruthy();
});
我刚开始学习angular单元测试。但是,此对带有 http 调用的函数的测试失败。我已经指出了问题,但是我无法解决它。我知道这是一些简单的问题
控制器
//Get data from URL
vm.getJson = function() {
var url = 'https://www.reddit.com/r/worldnews/new.json',
count = 0;
$http.get(url).success(function(response) {
console.log(response);
for (var i = 0; i < response.data.children.length; i++) {
vm.data.push(response.data.children[i].data);
count++;
if (count === response.data.children.length) {
vm.numberOfPages();
}
}
vm.result = true;
}).error(function(err) {
console.log(err);
});
};
我得到的回复是:
规格
//Testing the getJson function
describe('vm.getJson()', function() {
it('It should return dummy Data as response and vm.result to be truthy', function() {
var dummyData = {name: 'Umair'};
$httpBackend.whenRoute('GET','https://www.reddit.com/r/worldnews/new.json').respond(200, dummyData);
MainCtrl.getJson();
$httpBackend.flush();
expect(MainCtrl.result).toBeTruthy();
}); });
如果我从控制器函数中删除循环,我没有收到任何错误并且测试通过。我得到的错误是:
无法读取未定义 的 'Children'。从我附上响应数据的图像来看,children 是数组。
你的 dummyData 不是数组,我想这可以解决问题,请尝试下面的测试
//Testing the getJson function
describe('vm.getJson()', function() {
it('It should return dummy Data as response and vm.result to be truthy', function() {
var dummyData = [{ data: 'Umair' }];
$httpBackend
.when('GET', 'https://www.reddit.com/r/worldnews/new.json')
.respond(.respond(
function() {
return [200, dummyData, {}];
}););
MainCtrl.getJson();
$httpBackend.flush();
expect(MainCtrl.result).toBeTruthy();
});
});
您在测试中返回了一个带有 属性 name
的对象,然后您试图访问未定义的 属性 data
。
您应该在测试中模拟一个真实的响应对象,例如:
var dummyData = {
data: {
children: [
{ data: 'foo'}
]
}
};
当您的测试是 运行 时,$httpBackend 实际上会拦截 $http.get
调用并将 dummyData
分配给您在
$httpBackend.whenRoute('GET','https://www.reddit.com/r/worldnews/new.json').respond(200, dummyData);
这种模拟行为允许您快速完成单元测试,而不依赖于从您的测试机器访问 reddit。因此,在您的控制器中,response.data = {name: 'Umair'}
并且该对象没有名为 children
.
要解决这个问题,dummyData
尝试多模仿一下真实数据。
您应该在组件范围内定义未定义的变量:
beforeEach(async () => {
fixture = TestBed.createComponent(ExportWizardComponent);
component = fixture.componentInstance;
// DEFINE VALUES FOR VARIABLES
component.patientInfo = Constants.PROJECT_WIZARD_INFO;
component.wizardMove = of(null);
fixture.detectChanges();
});
it('should create', async () => {
expect(component).toBeTruthy();
});