Angularjs Breezejs单元测试与jasmine karma

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

我正在构建一个基于Breeze和Angular的应用程序

它们配合得很好,但单元测试是个问题

这是一个相当普通的测试,但微风一直在中间:

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
    规范之前执行

  • 在测试中,您费劲地模拟了auth调用(在启动逻辑的某个地方),但没有模拟Breeze调用

    我不知道你到底想测试什么。为什么要测试控制器是否获取身份验证令牌?这真的是控制员的问题吗

    也许您演示此测试只是为了说明您在测试控制器时遇到的问题,而没有涉及到真正的服务器

    让我退一步,提出一个更重要和更一般的观点。我们必须警惕自动启动逻辑,无论它隐藏在应用程序模块
    start
    或控制器的构造函数中。尤其要注意涉及到服务器调用的启动逻辑

    我倾向于在大多数测试中禁用自动启动逻辑。在我的测试模块设置过程中,我经常用测试双工代替麻烦的依赖服务。。。在调用ngMock的
    inject
    函数之前。我确保
    app.start
    方法的回调只使用容易伪造的依赖服务

    我想通过使用
    $httpBackend
    模拟HTTP响应来使用实际的依赖关系,然后您必须为它从启动代码收到的每个请求准备
    $httpBackend
    。。。包括您使用Breeze发出的请求

    最后我要重申,微风只会做你让它做的事。它完全不知道您的直接到-
    $http
    调用