2016-06-13 69 views
2

茉莉花測試輸入我有以下的輸入形式:與模式

<input type="email" name="email" ng-model="register.form.email" ng-pattern="emailRegex">

我想測試該窗體是無效的,如果用戶鍵入了無效的電子郵件:

it('...', function() { 
    form.email.$setViewValue('invalid'); 
    expect(form.email.$valid).toBeFalsy(); // OK 
    form.email.$setViewValue('[email protected]');  
    expect(form.email.$valid).toBeFalsy(); // OK 
    form.email.$setViewValue('[email protected]');  
    expect(form.email.$valid).toBeFalsy(); // Not OK  
}); 

最後一次expectatijon失敗,因爲輸入有效,但電子郵件正則表達式期望域。感覺就好像這個模式在我的測試中沒有使用,因爲當我將這個類型改爲文本時,它在第一次期望時已經失敗。我怎樣才能確保模式在測試中被挑選出來?

爲了完整,這是正則表達式(不是我寫的):

^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@[_A-Za-z0-9]+[_A-Za-z0-9-]*[_A-Za-z0-9]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$

更改類型text沒有工作。

我使用茉莉花2.4.1和角1.4.2。我使用ngHtml2JsPreprocessor作爲解釋here在我的測試中初始化表單。

編輯:

這是如何形成的初始化:

beforeEach(inject(function($rootScope, $templateCache, $compile) { 
    var $scope = $rootScope.$new(); 
    vm = $controller('RegisterController', {$scope: $scope}); 
    var templateHtml = $templateCache.get("register.html"); 
    var template = angular.element("<div>" + templateHtml + "</div>"); 
    $compile(template)($scope); 
    var form = $scope.registerForm; 
    $scope.$apply(); 
    scope = $scope; 
})); 
+0

什麼是測試將證明嗎?那個'ng-pattern'起作用了嗎?是的 - 它的工作原理,可能是開發AngularJS的團隊會在你面前發現錯誤。你想測試regExp?提取它並在單元測試中測試它 –

回答

2

AngularJS仍然有效的方式,它是如何發展

angular.module('app', []) 
 

 
describe('Registration form',() => { 
 
    'use strict' 
 

 
    beforeEach(module('app')) 
 

 
    let form 
 
    let scope 
 

 
    beforeEach(inject(($rootScope, $compile) => { 
 
    scope = $rootScope.$new() 
 
    var formElem = ['<form name="registrationForm">', 
 
     '<input type="text" name="number" ng-model="input" ng-pattern="/^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@[_A-Za-z0-9]+[_A-Za-z0-9-]*[_A-Za-z0-9]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$/">', 
 
     '</form>' 
 
    ].join('') 
 
    $compile(formElem)(scope) 
 
    form = scope.registrationForm 
 
    })) 
 

 
    it('has no `$valid` state',() => { 
 
    expect(form.$valid).toBeTruthy() 
 
    form.number.$setViewValue('invalid email address') 
 
    expect(form.number.$valid).toBeFalsy() 
 
    }) 
 

 
    it('has `$valid` state',() => { 
 
    expect(form.$valid).toBeTruthy() 
 
    form.number.$setViewValue('[email protected]') 
 
    expect(form.number.$valid).toBeTruthy() 
 
    }) 
 
})
<script src="https://safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine-2.0.3-concated.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-mocks.js"></script> 
 
<link href="https://safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine.css" rel="stylesheet" />

+0

正如你所看到的那樣,它的確如我所期望的那樣工作,所以我將從你的例子開始,構建我的測試用例。關於你的其他評論:可悲的是我不得不寫這個特殊的測試,即使我知道它沒有用。非常感謝! – Aerus

+0

您可以用來驗證電子郵件地址的一些非常有用的regExp - http://emailregex.com/ –

0

我想用form.email.$setViewValuescope beeing傳遞給你的$編譯範圍後,你應該叫scope.$digest();。這是我在每次測試中使用的。

您還可以看到更多的相關信息就在這裏:https://stackoverflow.com/a/22772504/4583079

+0

我試過了,不幸的是它不起作用。我可以看到,在最後期望之前,'modelValue'已經是'invalid @ host',這意味着它已經通過了解析器和驗證器(如果我沒有記錯的話)。 – Aerus

+0

您可以添加規格的初始化部分嗎?使用$ compile等。 – Paqman