Javascript 单元测试角度指令替换为textarea
嗨,我有这个指令定义,它被一个textarea代替。它看起来像这样:Javascript 单元测试角度指令替换为textarea,javascript,angularjs,unit-testing,jasmine,Javascript,Angularjs,Unit Testing,Jasmine,嗨,我有这个指令定义,它被一个textarea代替。它看起来像这样: angular.module('xyz') .directive('dir1', [function() { return { scope : {}, replace : true, template : "<textarea></textarea>", require : "ngModel", link : fun
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;
});
}
}
}]);
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中插入的函数确实会在我在浏览器中尝试时被调用,即在文本区域中键入内容时,在呈现的html上被调用。因为您正在对代码进行单元测试,所以您希望尝试将不同的部分分离成易于测试的单元。您提到,//…做一些事情
相当复杂。对我来说,这是一个需要重构成服务的问题,因为你可以控制输入和输出,所以服务本身可以很容易地进行测试
如果//…dosomething
与DOM交互,并且做了很多有副作用的古怪事情,那么这就是一种糟糕的代码味道,似乎应该对其进行重构以减少副作用
一旦你有了
//…做了一些事情
正确地提取并进行了单元测试,你在控制器中测试所需要的就是正确地添加了$parser
,这是一个简单得多的测试。我实际上是这样想的,但有点懒得提取出来。谢谢你的建议。我现在真的要试一试。顺便说一句,这是一个快速跟进的问题。如何在单元测试中获取$parsers列表以查看是否添加了该函数?我正在考虑将ctrl添加到独立的访问范围中。请看$controller服务。