【问题标题】:How to test self. angularjs controller functions in jasmine如何测试自己。茉莉花中的angularjs控制器功能
【发布时间】:2016-09-22 13:38:42
【问题描述】:

我的控制器中有以下代码

控制器:

self.DoSomething = function () {
    self.x="hai";
    self.y = function (id, data) {
        self.x="hello";
    }
}

$scope.Call=function(){
    self.DoSomething();
}

除了给定的代码之外,没有定义其他 self.y 函数。

每当我通过调用 jasmine 测试 Call 函数时。我的代码覆盖率没有显示在 self.y 函数中。即 self.x="hello" 没有被调用。请建议我如何做到这一点。

提前致谢。

【问题讨论】:

    标签: angularjs unit-testing angularjs-scope jasmine angular-controller


    【解决方案1】:

    self.y 只是self 的属性。唯一的调用方法是首先通过调用$scope.call() 定义它,然后调用self.y

    $scope.call();
    self.y();
    

    除非您从控制器中公开selfself.y 中的代码不可测试。如果你希望它在你调用 doSomething 时执行,你必须明确地这样做。

    self.DoSomething = function () {
        self.x="hai";
        self.y = function (id, data) {
            self.x="hello";
        }
        self.y();
    }
    

    但是你为什么要这样写你的代码呢?

    【讨论】:

    • 代码已经由其他团队编写,我不知道具体用法,也没有像 self.y() 这样的调用;代码里面。我怀疑他们是否从某些指令中调用它!是否可以在其他地方明确调用它?在某些地方,他们只是写了 var y= function (id, data) {...}。我也无法测试它们。
    • 除非self.y() 在该控制器的某处被调用(或者可能从其他地方,但那是糟糕的设计),否则该代码永远不会在应用程序中执行,也不需要测试!跨度>
    【解决方案2】:

    当您调用$scope.Call 时,self.y 没有被执行。它只是被定义。除非该函数由您的测试执行,否则您不会获得函数的覆盖率。你需要先执行$scope.Call,然后再执行self.y

    编辑:示例

    您需要在 Jasmine 测试中的某个地方:

    describe('y function', function () {
       it('should set self.x to "hello"', function () {
           $scope.Call()
           controllerName.y()
           expect(controllerName.x).toEqual("hello")
       })   
    })
    

    【讨论】:

    • 你的意思是我们不能这样称呼它吗?你能用一些代码来详细说明你的答案如何调用 $scope.y 吗?
    • 对不起,意思是 self.y。我的意思是你的self.Call 函数不会调用self.y。您需要致电self.y 以在您的测试中获得它的覆盖率。在上面添加了一个示例。
    • 如果这仍然令人困惑,然后发布您的测试文件。
    猜你喜欢
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多