模拟后端 GET 请求未被服务方法捕获
mocked backend GET request not caught by service method
我正在构建控制器名称 GeneController 的测试,它使用名为 Gene 的服务来制作一堆 API GET 请求。我已经像这样模拟了主要的 GET 请求,我很确定它工作正常:
$httpBackend.expectGET '/api/knowledge/genes/param1'
.respond(200, JSON.stringify({
data: {
mutationsUrl: 'http://localhost:3000/api/knowledge/genes/param1/mutations',
frequenciesUrl: 'http://localhost:3000/api/knowledge/genes/param1/frequencies',
annotationUrl: 'http://localhost:3000/api/knowledge/genes/param1/annotation',
sections: {
description: {
data: 'holder'
}
}
}
}))
控制器:基因控制器
.controller 'GeneController', Array '$scope', '$routeParams', '$http', 'Gene', ($scope, $routeParams, $http, Gene) ->
$scope.entity = Gene.get($routeParams
(entity) ->
$scope.description = entity.data.sections.description.data
entity.getUrl entity.data.mutationsUrl, {limit: 10}, (err, mutationsData) ->
if ! err?
for m in mutationsData.data
m.selected = true
$scope.mutations = mutationsData
entity.getUrl entity.data.frequenciesUrl, {}, (err, frequenciesData) ->
if ! err?
$scope.frequencies = frequenciesData
entity.getUrl entity.data.annotationUrl, {}, (err, annotationData) ->
if ! err?
$scope.annotation = annotationData
(error) ->
console.log error
)
服务:基因
.factory 'Gene', Array '$resource', '$http', ($resource, $http) ->
Gene = $resource '/api/knowledge/genes/:gene', {},
query:
method: 'GET'
Gene.prototype.getUrl = (url, options, callback) ->
$http {method: 'GET', url: url, params: options}
.then (res) -> # Success callback
callback null, res.data
,(res) -> # Error callback
callback res.status, res.data
Gene
我遇到的问题是 "secondary" GET 请求是由 Gene.prototype.getUrl 方法促进的。我认为该方法本身运行良好,因为正确的内容(来自突变、频率和注释)显示在网页上。但是,这些 GET 请求失败了,我从 mocha 收到以下错误:"undefined is not an object (evaluating 'mutationsData.data')"。
我嘲笑了对这些 GET 请求的响应,但无济于事。这是我对控制器的测试。
测试
...
describe 'GeneController', () ->
Gene = undefined
beforeEach inject (_$controller_, $rootScope, _Gene_, _$httpBackend_) ->
scope = $rootScope.$new()
controller = _$controller_ 'GeneController', {
$scope: scope
$routeParams: { gene: 'param1' }
}
Gene: _Gene_
$httpBackend = _$httpBackend_
describe 'valid response', () ->
beforeEach () ->
$httpBackend.whenGET 'http://localhost:3000/api/knowledge/genes/param1/mutations'
.respond(200, JSON.stringify({
data: "something"
}))
$httpBackend.whenGET 'http://localhost:3000/api/knowledge/genes/param1/frequencies'
.respond(200, JSON.stringify({
data: 'somethingelse'
}))
$httpBackend.whenGET 'http://localhost:3000/api/kowledge/gene/param1/annotation'
.respond(200, JSON.stringify({
data: 'somethingelser'
}))
$httpBackend.expectGET '/api/knowledge/genes/param1'
.respond(200, JSON.stringify({
data: {
mutationsUrl: 'http://localhost:3000/api/knowledge/genes/param1/mutations',
frequenciesUrl: 'http://localhost:3000/api/knowledge/genes/param1/frequencies',
annotationUrl: 'http://localhost:3000/api/knowledge/genes/param1/annotation',
sections: {
description: {
data: 'holder'
}
}
}
}))
$httpBackend.flush()
it "should set $scope.description when the Gene is called", () ->
expect(scope.description).to.equal "holder"
非常感谢对此问题的任何帮助。我完全坚持这一点。提前谢谢你:)
控制器正在以非 Restful 方式调用我们的 Rest API。我已将每个 GET 请求拆分为自己的代码块,使用 restangular 来实现承诺:
.controller 'GeneController', Array '$scope', '$routeParams', 'Gene', 'Restangular', ($scope, $routeParams, Gene, Restangular) ->
_genes_ = Restangular.all('knowledge').all('genes')
_genes_.get($routeParams.gene).then (results) ->
$scope.entity = results.data
$scope.description = $scope.entity.data.sections.description.data
.catch (error) ->
console.log 'Unable to load genes data'
_genes_.all($routeParams.gene).get('mutations').then (results) ->
for m in results.data.data
m.selected = true
$scope.mutations = results.data
.catch (error) ->
console.log 'Unable to load mutations data'
_genes_.all($routeParams.gene).get('frequencies').then (results) ->
$scope.frequencies = results.data
.catch (error) ->
console.log 'Unable to load frequencies data'
_genes_.all($routeParams.gene).get('annotation').then (results) ->
$scope.annotation = results.data
.catch (error) ->
console.log 'Unable to load annotation data'
我正在构建控制器名称 GeneController 的测试,它使用名为 Gene 的服务来制作一堆 API GET 请求。我已经像这样模拟了主要的 GET 请求,我很确定它工作正常:
$httpBackend.expectGET '/api/knowledge/genes/param1'
.respond(200, JSON.stringify({
data: {
mutationsUrl: 'http://localhost:3000/api/knowledge/genes/param1/mutations',
frequenciesUrl: 'http://localhost:3000/api/knowledge/genes/param1/frequencies',
annotationUrl: 'http://localhost:3000/api/knowledge/genes/param1/annotation',
sections: {
description: {
data: 'holder'
}
}
}
}))
控制器:基因控制器
.controller 'GeneController', Array '$scope', '$routeParams', '$http', 'Gene', ($scope, $routeParams, $http, Gene) ->
$scope.entity = Gene.get($routeParams
(entity) ->
$scope.description = entity.data.sections.description.data
entity.getUrl entity.data.mutationsUrl, {limit: 10}, (err, mutationsData) ->
if ! err?
for m in mutationsData.data
m.selected = true
$scope.mutations = mutationsData
entity.getUrl entity.data.frequenciesUrl, {}, (err, frequenciesData) ->
if ! err?
$scope.frequencies = frequenciesData
entity.getUrl entity.data.annotationUrl, {}, (err, annotationData) ->
if ! err?
$scope.annotation = annotationData
(error) ->
console.log error
)
服务:基因
.factory 'Gene', Array '$resource', '$http', ($resource, $http) ->
Gene = $resource '/api/knowledge/genes/:gene', {},
query:
method: 'GET'
Gene.prototype.getUrl = (url, options, callback) ->
$http {method: 'GET', url: url, params: options}
.then (res) -> # Success callback
callback null, res.data
,(res) -> # Error callback
callback res.status, res.data
Gene
我遇到的问题是 "secondary" GET 请求是由 Gene.prototype.getUrl 方法促进的。我认为该方法本身运行良好,因为正确的内容(来自突变、频率和注释)显示在网页上。但是,这些 GET 请求失败了,我从 mocha 收到以下错误:"undefined is not an object (evaluating 'mutationsData.data')"。
我嘲笑了对这些 GET 请求的响应,但无济于事。这是我对控制器的测试。
测试
...
describe 'GeneController', () ->
Gene = undefined
beforeEach inject (_$controller_, $rootScope, _Gene_, _$httpBackend_) ->
scope = $rootScope.$new()
controller = _$controller_ 'GeneController', {
$scope: scope
$routeParams: { gene: 'param1' }
}
Gene: _Gene_
$httpBackend = _$httpBackend_
describe 'valid response', () ->
beforeEach () ->
$httpBackend.whenGET 'http://localhost:3000/api/knowledge/genes/param1/mutations'
.respond(200, JSON.stringify({
data: "something"
}))
$httpBackend.whenGET 'http://localhost:3000/api/knowledge/genes/param1/frequencies'
.respond(200, JSON.stringify({
data: 'somethingelse'
}))
$httpBackend.whenGET 'http://localhost:3000/api/kowledge/gene/param1/annotation'
.respond(200, JSON.stringify({
data: 'somethingelser'
}))
$httpBackend.expectGET '/api/knowledge/genes/param1'
.respond(200, JSON.stringify({
data: {
mutationsUrl: 'http://localhost:3000/api/knowledge/genes/param1/mutations',
frequenciesUrl: 'http://localhost:3000/api/knowledge/genes/param1/frequencies',
annotationUrl: 'http://localhost:3000/api/knowledge/genes/param1/annotation',
sections: {
description: {
data: 'holder'
}
}
}
}))
$httpBackend.flush()
it "should set $scope.description when the Gene is called", () ->
expect(scope.description).to.equal "holder"
非常感谢对此问题的任何帮助。我完全坚持这一点。提前谢谢你:)
控制器正在以非 Restful 方式调用我们的 Rest API。我已将每个 GET 请求拆分为自己的代码块,使用 restangular 来实现承诺:
.controller 'GeneController', Array '$scope', '$routeParams', 'Gene', 'Restangular', ($scope, $routeParams, Gene, Restangular) ->
_genes_ = Restangular.all('knowledge').all('genes')
_genes_.get($routeParams.gene).then (results) ->
$scope.entity = results.data
$scope.description = $scope.entity.data.sections.description.data
.catch (error) ->
console.log 'Unable to load genes data'
_genes_.all($routeParams.gene).get('mutations').then (results) ->
for m in results.data.data
m.selected = true
$scope.mutations = results.data
.catch (error) ->
console.log 'Unable to load mutations data'
_genes_.all($routeParams.gene).get('frequencies').then (results) ->
$scope.frequencies = results.data
.catch (error) ->
console.log 'Unable to load frequencies data'
_genes_.all($routeParams.gene).get('annotation').then (results) ->
$scope.annotation = results.data
.catch (error) ->
console.log 'Unable to load annotation data'