【问题标题】:Angular Jasmine: View console output from controller?Angular Jasmine:查看控制器的控制台输出?
【发布时间】:2015-01-02 23:18:16
【问题描述】:

我刚刚开始使用 Jasmine 和 Karma 为我的 Angular 应用程序创建单元测试。当我认为它不应该失败时,我有一个测试失败了。我想从控制器本身获取控制台输出,而不仅仅是在控制器上运行的茉莉花测试,这可能吗?

这是一个代码示例: 测试:

it('First test', function() {
    var ctrl = controller('controller', {$scope: scope, MyHttpService: MyHttpMock});
    scope.update();

    console.log("I can see this console output");
    expect(scope.campaignID).toEqual('');
    expect(scope.data.pending).toEqual(20); // <--- fails here
});

控制器:

$scope.update = function() {
    MyHttpService.get('stats').then(function(data) {
        console.log("the data: ", data); // <-- can't see this output
        $scope.data = data;
    });
}

--编辑--

这是 MyHttpMock 的代码:

   var MyHttpMock = {
        get: function(key) {
                var deferred = $q.defer(),
                promise = deferred.promise;
                promise.then(function(data) {
                        return data;
                });
                if (key == "stats") {
                    deferred.resolve({"pending": 20})
                } else {
                    deferred.resolve({});
                }
                return promise;
            }
    };

我最初没有包含它,因为我的问题是关于如何从控制器中查看调试输出,而不是调试这个特定问题。但无论如何它都在这里,以防万一。

--结束编辑--

我可以从测试的控制台日志中看到返回值看起来是正确的。模拟服务似乎正在做它应该做的事情。但是测试失败了,它显示 scope.pending 为未定义。 MyHttpService 返回一个承诺,我怀疑它的结构不正确,或者类似的东西。但是,我不确定如何检查它。

有没有办法从控制器中查看控制台日志以查看实际传入的数据?

【问题讨论】:

  • MyHttpMock 中有什么内容?

标签: javascript angularjs unit-testing jasmine karma-runner


【解决方案1】:

假设您的模拟返回一个承诺,如下所示:-

var MyHttpMock = jasmine.createSpyObj('MyHttpMock', ['get']);
MyHttpMock.get.and.returnValue($q.when({pending:20}));

在设置期望之前和进行特定调用之后的测试中,您需要手动执行摘要循环来解决承诺。

it('First test', function() {
    var ctrl = controller('controller', {$scope: scope, MyHttpService: MyHttpMock});
    scope.update();
    scope.$apply(); //Trigger a digest
    ///...
    expect(scope.data.pending).toEqual(20); 
});

【讨论】:

    【解决方案2】:

    你的 promise.then() 是没有意义的,因为它只是用相同的微不足道的返回值包装了原始的承诺。您应该删除该行。就目前而言,.then() 返回一个不同的新派生承诺,但您返回的是原始的非派生承诺。

    【讨论】:

    • 您指的是哪个 .then ? promiseFactoryupdate() 方法中的那个?
    • 行-promise.then(function(data) { return data; }
    • 感谢您的提示。我还是角度的新手。虽然我会接受另一个答案,因为它解决了我原来的问题,但我也删除了那行。
    • @Trevor 需要明确的是,整个函数可以替换为function(key) { return $q.when(key == "stats" ? {"pending": 20} : {}); }。您一式三份地使用Deferred Antipattern
    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 2020-05-24
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多