我正在尝试模拟用户操作并测试AngularJS控制器对他们的反应。
describe('Testing a controller component', function () { beforeEach(inject(function ($compile, $rootScope, $httpBackend, $templateCache) { scope = $rootScope.$new(); element = angular.element('<sign-up></sign-up>'); element = $compile(element)(scope); scope.$digest(); controller = element.controller('signUp'); scope.$apply(); })); it('should render template', function () { element.find('input').val('123'); scope.$digest(); expect(controller.firstName).toBe('123'); }); });
由于模型字段未更新,测试失败。
Expected undefined to be '123'.
at UserContext.<anonymous> (tests/calculator.controller.test.js:54:42)
我知道这违反了 AngualrJs 方法,但我想用它来进行测试。
更多 "AngualrJS" 模拟用户输入的方法 是访问输入的ngModelController
并使用$setViewValue()
方法更改视图值。这样的事情应该有效:
it('should reflect to the users input', function () {
var input = element.find('input');
var ngModelCtrl = input.controller('ngModel');
ngModelCtrl.$setViewValue('Dan');
expect(controller.firstName).toBe('Dan');
});
但是,如果您仍然想继续使用您的方法,那么您必须在 input
元素上触发updateOn
事件之一(使用 triggerHandler
方法(,以便该值将应用于$modelValue
:
it('should reflect to the users input', function () {
element.find('input').val('123').triggerHandler('input');
expect(controller.firstName).toBe('123');
});