Angular 如何编写电子邮件和密码验证的单元测试?
我确实有以下http POST请求的小功能,其中我检查有关验证的电子邮件和密码 实现it单元测试的最佳方法是什么Angular 如何编写电子邮件和密码验证的单元测试?,angular,unit-testing,jasmine,Angular,Unit Testing,Jasmine,我确实有以下http POST请求的小功能,其中我检查有关验证的电子邮件和密码 实现it单元测试的最佳方法是什么 MAIL_RegExp = /^\w+([d\\+1\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/i; Pass_RegExp = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[#$@!%&*?])[A-Za-z\d#$@!%&*?]{8,30}$/i; storeUser(uemail:string,
MAIL_RegExp = /^\w+([d\\+1\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/i;
Pass_RegExp = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[#$@!%&*?])[A-Za-z\d#$@!%&*?]{8,30}$/i;
storeUser(uemail:string, upass:string) {
if (!this.MAIL_RegExp.test(uemail)) {
return false;
} else if (!this.Pass_RegExp.test(upass)) {
return false;
} else {
this.uService.regUser(uemail, upass)
.subscribe(
(res) => {this.openDialog(uemail);},
(err) => {this.errMsg = err;}
);
}
}
所以前两个测试只是测试验证。您可能需要所有测试的许多不同版本来测试正则表达式是否正常工作
it(`should return false when storeUser is called with an invalid email`, async(() => {
const invalidEmail = 'sample invalid Email goes here';
const validPassword = 'sample valid Password goes here';
let result = storeUser(invalidEmail, validPassword);
expect(result).toEqual(false);
}));
it(`should return false when storeUser is called with an invalid password`, async(() => {
const validEmail = 'sample valid Email goes here';
const invalidPassword = 'sample invalid Password goes here';
let result = storeUser(validEmail, invalidPassword);
expect(result).toEqual(false);
}));
所以第三个比较有趣。首先,您必须掌握注入的uService。然后您需要监视regUser函数,以便测试它是否已被调用。但是您还需要返回一个Observable,因为如果您不返回,对subscribe的调用将抛出一个错误。因为你没有在下面的测试中使用任何可观察的东西,所以任何东西的可观察性都应该起作用
it(`should call regUser on uService when storeUser is called with valid Email and Password`, async(() => {
let uService = TestBed.get(Type of uService);
spyOn(uService, 'regUser').and.returnValue(Observable.of(An instance of the return type of regUser));
const validEmail = 'sample valid Email goes here';
const validPassword = 'sample valid Password goes here';
let result = storeUser(validEmail, validPassword);
expect(uService.regUser).toHaveBeenCalled();
}));
您可以测试的最后一件事是,this.errMsg中存储了错误,并且调用了openDialog函数。为此,您需要正确设置返回的Observable并监视openDialog函数。仔细想想,openDialog可能会破坏上述测试,因此您可能需要监视它以将其存根。太好了。。。有益的解释。我将进行必要的更改并尝试一下。@lain:运行良好,除了
spyOn(uService,regUser).and.returnValue(regUser的返回类型的实例的新的Observable.of))
抛出错误:[ts]只有void函数可以用'new'关键字调用。
我不能理解的是regUser返回类型的一个实例。这应该得到定义了regUser
的服务实例。比如:newobservable.of(regUser返回类型的实例)
。当我删除new
时,工作正常,但测试抛出:Failed::function(email,pass){….}()方法不存在用法:spyOn(,)
很抱歉,这是一行不整洁的代码。是的,新的关键字是一个错误,它不应该出现在那里。同样在spyOn函数中,第一个参数是包含该方法的对象,第二个参数是一个字符串,它是被监视的方法的名称。(我给失踪的雷格瑟加了引号)。@lain:太好了。函数已更新,但有一个小问题:预期已调用spy regUser。
这是更新:当使用有效的电子邮件和密码调用storeUser时,它(应在uService上调用regUser,async(()=>{let uService=TestBed.get(uService);spyOn(uService,'regUser')。和.returnValue(可观察的(uService));const validEmail=['test@test.com','test@test.co.uk'];const validPassword='!q2wAscb';let result=component.storeUser(validmail,validPassword);expect(uService.regUser.tohavebeencall();});一个主意?一直在搜索,但无法修复。我的第一个怀疑是您的一个正则表达式失败。不幸的是,我无法测试它,因为我无法让正则表达式在我的机器上工作,因为它无法识别函数测试。