您好我有这个指令定义,它被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上调用。
答案 0 :(得分:1)
由于您是 unit 测试代码,因此您希望尝试将不同的部分隔离到易于测试的单元中。你提到//..do some stuff
非常复杂。对我而言,这是一种尖叫,需要重构为一项服务,由于您可以控制输入和输出,因此可以轻松测试。
如果//..do some stuff
与DOM交互并且做了大量带有副作用的时髦事物,那就是代码味道很差,并且似乎应该重构它以减少副作用。
正确提取//..do some stuff
并进行单元测试后,您在控制器中进行测试所需的全部内容是$parser
被正确添加,这是一个更简单的测试。