在 Angularjs/Jasmine 测试中测试数据库响应
Testing a database response in an Angularjs/Jasmine test
我正在尝试对 jasmine 中的 angular 工厂进行单元测试,但我无法理解如何从我的数据库中获取实际响应。
我有以下工厂代码,它根据公司代码值检索包含公司信息的对象。
工厂工作正常,但我想在 jasmine 中测试它。
app.factory('adminOps',function($http, $log, $q){
return {
getByTicker: function(ticker){
return $http.post("http://localhost:3000/ticker", {"ticker": ticker})
.then(function(response){
if (typeof response.data === 'object') {
return response.data;
} else {
return $q.reject(response.data);
}
}, function(response) {
return $q.reject(response);
});
}
};
});
为了对此进行测试,我根据找到的在线示例编写了以下 jasmine 代码。
describe('adminOps', function() {
var factory, http;
beforeEach(module('myApp'));
beforeEach(inject(function(_adminOps_, $httpBackend) {
factory = _adminOps_;
http = $httpBackend;
}));
it('Should retrieve company data', function(done) {
var testCompany = function(company) {
expect(company.name).toBe("Google Inc.");
};
var failTest = function(error) {
expect(error).toBeUndefined();
}
http.expectPOST('http://localhost:3000/ticker',{ticker:"GOOG"}).respond(200, {ticker:"GOOG"});
factory.getByTicker("GOOG")
.then(testCompany)
.catch(failTest)
.finally(done);
http.flush();
});
});
我得到一个Expected undefined to be 'Google Inc.'
。
如何调用我的工厂并测试我发送的代码参数的正确名称值?
更新:Koen 的代码可以正常工作。我发现如果你想在服务器上测试值,比如休息 api,那么你应该尝试像 frisby 这样的东西,它是基于 Jasmine 构建的。
单元测试应该测试你的本地代码,不应该有外部依赖。因此,您的测试不会也不应该实际访问您的数据库。
$httpBackend 允许您模拟 http 请求和响应。
您的代码模拟 $httpBackend 如下:
http.expectPOST('http://localhost:3000/ticker',{
ticker:"GOOG"
}).respond(200,{
ticker:"GOOG"
});
表示它将以
的响应进行响应
{ticker:"GOOG"}
因此它没有您需要的 'name' 属性。
测试 'getByTicker' 方法的正确方法是使用以下 $httpBackend 设置:
$http.expectPOST('http://localhost:3000/ticker', {
ticker: "GOOG"
}).respond(200, {
name: "Google Inc."
});
我正在尝试对 jasmine 中的 angular 工厂进行单元测试,但我无法理解如何从我的数据库中获取实际响应。
我有以下工厂代码,它根据公司代码值检索包含公司信息的对象。
工厂工作正常,但我想在 jasmine 中测试它。
app.factory('adminOps',function($http, $log, $q){
return {
getByTicker: function(ticker){
return $http.post("http://localhost:3000/ticker", {"ticker": ticker})
.then(function(response){
if (typeof response.data === 'object') {
return response.data;
} else {
return $q.reject(response.data);
}
}, function(response) {
return $q.reject(response);
});
}
};
});
为了对此进行测试,我根据找到的在线示例编写了以下 jasmine 代码。
describe('adminOps', function() {
var factory, http;
beforeEach(module('myApp'));
beforeEach(inject(function(_adminOps_, $httpBackend) {
factory = _adminOps_;
http = $httpBackend;
}));
it('Should retrieve company data', function(done) {
var testCompany = function(company) {
expect(company.name).toBe("Google Inc.");
};
var failTest = function(error) {
expect(error).toBeUndefined();
}
http.expectPOST('http://localhost:3000/ticker',{ticker:"GOOG"}).respond(200, {ticker:"GOOG"});
factory.getByTicker("GOOG")
.then(testCompany)
.catch(failTest)
.finally(done);
http.flush();
});
});
我得到一个Expected undefined to be 'Google Inc.'
。
如何调用我的工厂并测试我发送的代码参数的正确名称值?
更新:Koen 的代码可以正常工作。我发现如果你想在服务器上测试值,比如休息 api,那么你应该尝试像 frisby 这样的东西,它是基于 Jasmine 构建的。
单元测试应该测试你的本地代码,不应该有外部依赖。因此,您的测试不会也不应该实际访问您的数据库。
$httpBackend 允许您模拟 http 请求和响应。
您的代码模拟 $httpBackend 如下:
http.expectPOST('http://localhost:3000/ticker',{
ticker:"GOOG"
}).respond(200,{
ticker:"GOOG"
});
表示它将以
的响应进行响应{ticker:"GOOG"}
因此它没有您需要的 'name' 属性。
测试 'getByTicker' 方法的正确方法是使用以下 $httpBackend 设置:
$http.expectPOST('http://localhost:3000/ticker', {
ticker: "GOOG"
}).respond(200, {
name: "Google Inc."
});