【发布时间】:2015-06-11 11:59:16
【问题描述】:
我正在使用 jasmine & karma 来测试我的 Angular 应用程序。我有如下服务
app.service('demo1', function( $http ){
this.send = function(){
return $http({
url: 'someurl'
});
}
});
使用ngMockE2E 模拟响应。
我的茉莉花规格如下:
describe('Testing asynchronus', function(){
var demoService;
beforeEach(function(){
module('app');
inject(function( demo1 ){
demoService = demo1
});
});
it('Should be able to test promise', function(){
demoService.send().then(function( data ){
expect(data.status).toBe(true);
});
});
});
现在的问题是,expect 没有执行。每次都通过测试,无论data.status 的值是多少。我需要有关如何测试这些场景的帮助?提前致谢。
真实代码:
describe("Testing MetaService", function(){
var _entityMeta_, metaService, scope;
beforeEach(function(){
console.log( '---------------------- Starting Meta Service fetchEntityMeta Test ---------------------------' );
module(APP_MODULE_NAME);
inject(function(_entityMeta_, _metaService_, $rootScope){
metaService = _metaService_;
entityMeta = _entityMeta_;
scope = $rootScope.$new();
});
});
afterEach(function(){
console.log( '---------------------- Ending Meta Service fetchEntityMeta Test ---------------------------' );
});
// Giving mock data from entityMeta.person as input
it("Should have a valid structure", function($rootScope){
console.log( '////////////////////////////////////////////' );
metaService.fetchEntityMeta('person').then(function( data ){
console.log( data );
expect(data.type).toBe('object');
expect(data.properties.length).toBeGreaterThan(0);
expect(data.definitions.length).toBeGreaterThan(0);
});
});
});
我收到以下错误:
Error: Timeout - Async callback was not invoked within timeout specified
by jasmine.DEFAULT_TIMEOUT_INTERVAL.
【问题讨论】:
-
ngMockE2E 用于端到端测试,而不是用于使用 karma 运行的单元测试。你需要告诉 ngMock $httpBackend 做什么。阅读文档:docs.angularjs.org/api/ngMock/service/$httpBackend
-
我主要关心的是如何测试该方法是否返回一个承诺。除了 ngMock,我还尝试过使用 $q。似乎如果函数返回一个承诺,则“then”回调中的期望块将不会被执行。
-
您需要调用 $scope.$apply()(或 $rootScope.$apply()),以便在您解决承诺后调用承诺回调。
-
我的承诺是在服务方法中解决的。看起来如果服务在规范文件的描述块内被模拟和解析,那么这个 $scope.$apply() 可以用来测试它,但在我的例子中,它不起作用。我需要这适用于真正的 api 响应,用于验证 api 的响应
-
我们在您未显示的代码中找不到错误。发布 REAL 代码,告诉我们您希望它做什么以及它会做什么。
标签: angularjs unit-testing jasmine karma-runner karma-jasmine