1
我有一个服务,包装阿贾克斯调用($ http)并返回一个承诺。在我的控制,我解决与MyService.stuff(…).
then
(fn(data){ $scope.stuff = data; })
茉莉花:承诺测试功能
承诺如何测试的$scope.stuff
价值?
// controller
$scope.stuff = false;
$scope.getStuff = function(name)
{
if (!angular.isDefined($scope.users[ name ]))
MyService.stuff('get' , username).then(function(data)
{ // returns the value of resp.data
$scope.stuff = $scope.users[ name ] = data;
});
else
$scope.stuff = $scope.users[ name ];
};
我已经得到了测试看起来是这样的:
// test
describe('scope.stuff',function()
{
it('should initialize as false', function()
{ // this passes
expect(scope.stuff).toBe(false);
});
var httpBackend;
beforeEach(inject(function($httpBackend){
httpBackend = $httpBackend;
}));
it('should have 4 elements', function()
{ // this stalls
runs(function()
{
httpBackend.whenGET().respond(200,
{ data: [
{name: 'foo'}, {name: 'bar'}, {name: 'baz'},{name: 'qux'}
]});
scope.getStuff('foo');
});
waitsFor(function()
{
scope.$apply();
return scope.stuff;
});
runs(function()
{
expect(scope.stuff.length).toBe(4);
});
});
});
看起来您的测试需要2个摘要循环。 httpBackend.flush()用于模拟服务器响应和范围。$ apply()用于解决承诺 –
@EitanPeer,这似乎已经修复了拖延!但是* MyService *似乎并没有拦截httpBackend的响应:当我在'expect.stuff'上面记录期望值时,我得到的是整个对象而不是* data *的值。你知道这是为什么吗? – jacob
@EitanPeer,没关系,我是个白痴。我将有效负载作为名为* data *的对象提供给响应对象的* data * obj。谢谢你的帮助!你会发表你的评论作为答案,所以我可以批准它并关闭这个问题吗? – jacob