单元测试角度指令由textarea替换

时间:2015-07-04 17:16:37

标签: javascript angularjs unit-testing jasmine

您好我有这个指令定义,它被textarea取代。它看起来像这样:

angular.module('xyz')
.directive('dir1', [function()
{
    return {
        scope : {},
        replace : true,
        template : "<textarea></textarea>",
        require : "ngModel",
        link : function(scope, element, attrs, ctrl)
        {
            ctrl.$parsers.push(function(value)
            {
                //..do some stuff
                return value;
            });
        }
    }
}]);

现在问题是我无法真正测试ctrl.$parsers内的分支。我尝试了很多不同的东西。它是一个表单很容易,所以我只做scope.input_form.input_value.$setViewValue('abcd')之类的事情,模型得到更新,等等。这种情况很难达到$解析器。 //..do some stuff的位非常长并且有一些极端情况,通过反复试验测试它是不可行的。有人可以帮忙吗?如果不清楚,我会提供更多细节。

更新:

所以单元测试是这样的:

describe('Specs for dir1', function()
{
    var scope, dir_1;
    beforeEach(module('xyz'));
    beforeEach(inject(function($compile, $rootScope)
    {
         scope = $rootScope.$new();
         scope.test_data = "";
         dir_1 = $compile("<dir1 ng-model='test_data'></dir1>")(scope);
    }));

    it('Does some stuff in $parsers when view value changes', function()
    {
        //I want to do something like this:
        //<textarea>.setViewValue("some value") which will
        //call one of the functions injected in $parsers.
    });
});
顺便说一句,你可以放心,当我在浏览器中尝试时,在$ parsers中注入的函数会被调用,即当我在textarea中输入内容时在渲染的html上调用。

1 个答案:

答案 0 :(得分:1)

由于您是 unit 测试代码,因此您希望尝试将不同的部分隔离到易于测试的单元中。你提到//..do some stuff非常复杂。对我而言,这是一种尖叫,需要重构为一项服务,由于您可以控制输入和输出,因此可以轻松测试。

如果//..do some stuff与DOM交互并且做了大量带有副作用的时髦事物,那就是代码味道很差,并且似乎应该重构它以减少副作用。

正确提取//..do some stuff并进行单元测试后,您在控制器中进行测试所需的全部内容是$parser被正确添加,这是一个更简单的测试。