Angularjs Breezejs单元测试与jasmine karma
我正在构建一个基于Breeze和Angular的应用程序 它们配合得很好,但单元测试是个问题 这是一个相当普通的测试,但微风一直在中间:Angularjs Breezejs单元测试与jasmine karma,angularjs,unit-testing,breeze,karma-jasmine,Angularjs,Unit Testing,Breeze,Karma Jasmine,我正在构建一个基于Breeze和Angular的应用程序 它们配合得很好,但单元测试是个问题 这是一个相当普通的测试,但微风一直在中间: describe('myController', function () { beforeEach(inject(function ($injector) { module('app'); $httpBackend = $injector.get('$httpBackend'); authRequest
describe('myController', function () {
beforeEach(inject(function ($injector) {
module('app');
$httpBackend = $injector.get('$httpBackend');
authRequestHandler = $httpBackend.whenGET().respond(200,
{"someStrings": ["foo", "bar"]})
//more uninteresting code...
createController = function () {
return $controller('myController', { '$scope': $rootScope });
};
}));
it('should fetch authentication token', function () {
$httpBackend.expectGET('/auth.py');
var controller = createController();
$httpBackend.flush();
});
问题是Breeze一直在初始化。执行时,我收到以下消息:
Error: cannot execute _executeQueryCore until metadataStore is populated.
//or,with different get: ... $httpBackend.when('GET', '/auth.py')
// .respond({ userId: 'userX' });
Error: Unexpected request: GET breeze/Breeze/Metadata No more request expected
我如何防止或模拟或测试,以免干扰我的测试。。。例如,这些测试的目标是身份验证,而不是数据。Breeze本身并不是“居中”。Breeze不会参与您的$http
授权调用。如果你能证明我的帽子是真的,我就把它吃掉。你还没有证明这一点
但您已经发现了一个非常有趣的观点,即应用程序引导设计以及该设计对测试的影响
显然,您的app
模块的启动方法或控制器的创建逻辑都会执行Breeze查询(可能两者都会执行)。我从两个事实推断:
executeQueryCore
,只有在显式执行Breeze查询时才会发生beforeach
中还是在it
中,您都不会触摸控制器,这意味着这些调用(以及您的auth调用)是由某种自动启动逻辑进行的,该逻辑在it
规范之前执行start
或控制器的构造函数中。尤其要注意涉及到服务器调用的启动逻辑
我倾向于在大多数测试中禁用自动启动逻辑。在我的测试模块设置过程中,我经常用测试双工代替麻烦的依赖服务。。。在调用ngMock的inject
函数之前。我确保app.start
方法的回调只使用容易伪造的依赖服务
我想通过使用$httpBackend
模拟HTTP响应来使用实际的依赖关系,然后您必须为它从启动代码收到的每个请求准备$httpBackend
。。。包括您使用Breeze发出的请求
最后我要重申,微风只会做你让它做的事。它完全不知道您的直接到-$http
调用