- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了以下测试:
import { DebugElement } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { AuthenticationService } from '../services/authentication.service';
import { By } from '@angular/platform-browser';
import { LoginComponent } from './login.component';
import { ReactiveFormsModule } from '@angular/forms';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { RouterTestingModule } from '@angular/router/testing';
import { GlobalDataService } from '../services/global-data.service';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { DatePipe } from '@angular/common';
import { MatDialogModule } from '@angular/material/dialog';
import { OverlayModule } from '@angular/cdk/overlay';
describe('LoginComponent', () => {
let component: LoginComponent;
let fixture: ComponentFixture<LoginComponent>;
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [ LoginComponent ],
imports: [ ReactiveFormsModule, MatFormFieldModule, MatProgressSpinnerModule, RouterTestingModule, HttpClientTestingModule,
OverlayModule, MatDialogModule ],
providers: [ GlobalDataService, DatePipe, AuthenticationService ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(LoginComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
it('should set instance correctly', () => {
expect(component).not.toBeNull();
});
it('should call auth login method', waitForAsync(() => {
let loginElement: DebugElement;
const debugElement = fixture.debugElement;
const authenticationService = debugElement.injector.get(AuthenticationService);
const loginSpy = spyOn(authenticationService, 'login').and.callThrough();
loginElement = fixture.debugElement.query(By.css('form'));
// to set values
component.loginForm.controls.username.setValue('test@test.com');
component.loginForm.controls.password.setValue('testpassword');
loginElement.triggerEventHandler('ngSubmit', null);
expect(loginSpy).toHaveBeenCalledTimes(1); // check that service is called once
// ^ this fails without correct login!
}));
it('should render "Login" at the top of the login page', () => {
fixture.detectChanges();
const compiled = fixture.debugElement.nativeElement;
expect(compiled.querySelector('h5').textContent).toContain('Login');
});
});
我的 Login.component.ts:
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AuthenticationService } from '../services/authentication.service';
import { GlobalDataService } from '../services/global-data.service';
/* tslint:disable variable-name */
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {
returnUrl: string;
loginForm: FormGroup;
submitted = false;
error = '';
loading = false;
public errorMsg = 'Please login to continue';
public redirected: boolean;
public utm_source: string;
constructor(private router: Router, private formBuilder: FormBuilder, public DataService: GlobalDataService,
public authenticationService: AuthenticationService, private activatedRoute: ActivatedRoute) {
this.activatedRoute.queryParams.subscribe(params => {
const param = params.utm_source;
if ([ 'a', 'b', 'c', 'd', 'e'].includes(param)) {
this.redirected = true;
this.utm_source = param;
} else {
this.redirected = false;
}
});
}
ngOnInit(): void {
this.loginForm = this.formBuilder.group({
email: ['', [Validators.required, Validators.email]],
password: ['', [Validators.required, Validators.minLength(6)]]
});
}
// convenience getter for easy access to form fields
get f() { return this.loginForm.controls; }
onSubmit(loginsubmit) {
this.submitted = true;
// stop here if form is invalid
if (this.loginForm.invalid) {
return console.log('LoginForm Invalid');
}
this.loading = true;
this.authenticationService.login(this.f.email.value, this.f.password.value)
.pipe()
.subscribe(
data => {
// it was this.returnUrl instead of avior/dashboard
if (this.redirected) {
this.router.navigate([this.utm_source]);
} else {
this.router.navigate(['landing-page']);
}
},
error => {
console.log('Login->authservice->err: ', error);
this.error = error;
this.loading = false;
});
}
}
我得到的错误发生在
should call auth login method
上测试以下错误:
Failed: Cannot read property 'setValue' of undefined
所以看起来 LoginForm 表单不知何故和不知何故未定义。知道为什么会这样吗?表单字段的定义似乎很好,老实说,我不知道出了什么问题。最奇怪的部分是它曾经可以工作,现在迁移代码后就不行了。我尝试修补代码但无济于事。
最佳答案
在您的测试设置中,您试图在表单中不存在的控件上设置一个值。component.loginForm.controls.username.setValue('test@test.com'); // username doesn't exisit
该属性称为电子邮件。尝试将行更改为:component.loginForm.controls.email.setValue('test@test.com');
关于angular - 失败 : Cannot read property 'setValue' of undefined for a login test,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66135629/
我只是有一个更琐碎的问题。 为什么undefined == undefined 返回true,而undefined >= undefined 为false? undefined 等于 undefine
用PHP 7.2编写套接字服务器。根据Firefox 60中的“网络”选项卡,服务器的一些HTTP响应的第一行随机变为undefined undefined undefined。因此,我尝试记录套接字
在 JavaScript 中这是真的: undefined == undefined 但这是错误的: undefined <= undefined 起初我以为<=运算符包含第一个,但我猜它试图将其转换
在回答这个问题 (Difference between [Object, Object] and Array(2)) 时,我在 JavaScript 数组中遇到了一些我以前不知道的东西(具有讽刺意味的
来自https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/of , Note: thi
我正在运行 PHP 脚本并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php
我正在运行 PHP 脚本并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php
当我添加 到我的 PrimeFaces Mobile 页面,然后我在服务器日志中收到以下警告 WARNING: JSF1064: Unable to find or serve resource, u
我正在运行 PHP 脚本并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php
我正在运行 PHP 脚本并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php
我正在运行 PHP 脚本并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php
我正在运行 PHP 脚本并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php
我正在运行 PHP 脚本并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php
我正在运行 PHP 脚本并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php
我正在运行 PHP 脚本并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php
我正在运行 PHP 脚本并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php
我正在运行 PHP 脚本并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php
我正在运行 PHP 脚本并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php
我正在运行 PHP 脚本并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php
我正在运行 PHP 脚本并继续收到如下错误: Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php
我是一名优秀的程序员,十分优秀!