是否可以在模拟的$ httpBackend中覆盖或重新定义模拟响应?
我有这样的测试:
beforeEach(inject(function ($rootScope, $controller, _$httpBackend_) {
$httpBackend = _$httpBackend_;
//Fake Backend
$httpBackend.when('GET', '/myUrl').respond({}); //Empty data from server
...some more fake url responses...
}
对于大多数情况来说这很好但是我几乎没有测试我需要为同一个URL返回不同的东西。但似乎一旦定义了when()。respond(),我就不能在这样的代码中改变它:
单个特定测试中的不同响应:
it('should work', inject(function($controller){
$httpBackend.when('GET', '/myUrl').respond({'some':'very different value with long text'})
//Create controller
//Call the url
//expect that {'some':'very different value with long text'} is returned
//but instead I get the response defined in beforeEach
}));
我该怎么做? 我的代码现在是不可测试的:(
答案 0 :(得分:27)
文档似乎暗示了这种风格:
var myGet;
beforeEach(inject(function ($rootScope, $controller, _$httpBackend_) {
$httpBackend = $_httpBackend_;
myGet = $httpBackend.whenGET('/myUrl');
myGet.respond({});
});
...
it('should work', function() {
myGet.respond({foo: 'bar'});
$httpBackend.flush();
//now your response to '/myUrl' is {foo: 'bar'}
});
答案 1 :(得分:12)
在回复中使用功能,例如:
var myUrlResult = {};
beforeEach(function() {
$httpBackend.when('GET', '/myUrl').respond(function() {
return [200, myUrlResult, {}];
});
});
// Your test code here.
describe('another test', function() {
beforeEach(function() {
myUrlResult = {'some':'very different value'};
});
// A different test here.
});
答案 2 :(得分:9)
另一个选择是:
你可以使用
$httpBackend.expect().respond()
代替$httpBackend.when().respond()
使用expect()
,您可以按两次相同的网址,并按照推送它们的顺序获得不同的响应。
答案 3 :(得分:6)
在测试中使用.expect()而不是.when()
var myUrlResult = {};
beforeEach(function() {
$httpBackend.when('GET', '/myUrl')
.respond([200, myUrlResult, {}]);
});
it("overrides the GET" function() {
$httpBackend.expect("GET", '/myUrl')
.respond([something else]);
// Your test code here.
});
答案 4 :(得分:0)
您可以在执行测试的同一个函数中重置“何时”响应。
it('should work', inject(function($controller){
$httpBackend.when('GET', '/myUrl').respond({'some':'value'})
// create the controller
// call the url
$httpBackend.flush();
expect(data.some).toEqual('value');
});
it('should also work', inject(function($controller){
$httpBackend.when('GET', '/myUrl').respond({'some':'very different value'})
// create the controller
// call the url
$httpBackend.flush();
expect(data.some).toEqual('very different value');
});
请参阅此plunker中的示例:http://plnkr.co/edit/7oFQvQLIQFGAG1AEU1MU?p=preview