angular 4单元测试问题-我想设置表单FormControl fields值

angular 4单元测试问题-我想设置表单FormControl fields值,angular,unit-testing,jasmine,testbed,Angular,Unit Testing,Jasmine,Testbed,我在单元测试中设置名为searchUser的FormControl字段的值时遇到问题 在下面的代码中,“this.searchUser.value”是一个表单控件。 所以在我的测试中,我这样做是为了设置它,但不起作用: homeComponent.searchUser = new FormControl(); homeComponent.searchUser.value = "ste"; 这是我正在测试的组件方法(mapUsers): mapUsers(users: User[]): User

我在单元测试中设置名为searchUser的FormControl字段的值时遇到问题

在下面的代码中,“this.searchUser.value”是一个表单控件。 所以在我的测试中,我这样做是为了设置它,但不起作用:

homeComponent.searchUser = new FormControl();
homeComponent.searchUser.value = "ste";
这是我正在测试的组件方法(mapUsers):

mapUsers(users: User[]): User[] {
    let results: User[] = [];

    users.forEach((user: User) => {
      let name = user.name.toLowerCase();
      if (name.includes(this.searchUser.value.toLowerCase())) results.push(user);      
    });

    return results; 
  }
import { TestBed, async, inject } from "@angular/core/testing";
import { Observable } from "rxjs/Observable";
import { of } from 'rxjs/observable/of';
import { HttpClient, HttpHandler } from "@angular/common/http";
import { RouterTestingModule } from "@angular/router/testing";
import { FormControl } from "@angular/forms";

import { HomeComponent } from "./home.component";
import { HomeModule } from "./home.module";
import { UserService } from "../../services/user.service";
import { User } from "../../models/user.model";
import { HighlightDirective } from "../../directives/highlight.directive";

describe("HomeComponent", () => {
  let userService;
  let homeComponent;
  let fixture;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [
        HomeModule,
        RouterTestingModule.withRoutes([])
      ],
      providers: [
        HttpClient,
        HttpHandler,
        UserService
      ]
    })
  });

  beforeEach(inject([UserService], service => {
    userService = service;
    fixture = TestBed.createComponent(HomeComponent);
    homeComponent = fixture.componentInstance;
  }));

  it("should return array of users", async(() => {
    // Arrange
    const mockUsers: User[] = [{"name": "Steven"}];
    homeComponent.searchUser = new FormControl();
    homeComponent.searchUser.value = "ste";

    // Act
    const mockResponse = homeComponent.mapUsers(mockUsers);
    fixture.detectChanges();

    // Assert
    expect(mockResponse).toEqual(mockUsers);
  }));

});
这是我的完整单元测试规范:

mapUsers(users: User[]): User[] {
    let results: User[] = [];

    users.forEach((user: User) => {
      let name = user.name.toLowerCase();
      if (name.includes(this.searchUser.value.toLowerCase())) results.push(user);      
    });

    return results; 
  }
import { TestBed, async, inject } from "@angular/core/testing";
import { Observable } from "rxjs/Observable";
import { of } from 'rxjs/observable/of';
import { HttpClient, HttpHandler } from "@angular/common/http";
import { RouterTestingModule } from "@angular/router/testing";
import { FormControl } from "@angular/forms";

import { HomeComponent } from "./home.component";
import { HomeModule } from "./home.module";
import { UserService } from "../../services/user.service";
import { User } from "../../models/user.model";
import { HighlightDirective } from "../../directives/highlight.directive";

describe("HomeComponent", () => {
  let userService;
  let homeComponent;
  let fixture;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [
        HomeModule,
        RouterTestingModule.withRoutes([])
      ],
      providers: [
        HttpClient,
        HttpHandler,
        UserService
      ]
    })
  });

  beforeEach(inject([UserService], service => {
    userService = service;
    fixture = TestBed.createComponent(HomeComponent);
    homeComponent = fixture.componentInstance;
  }));

  it("should return array of users", async(() => {
    // Arrange
    const mockUsers: User[] = [{"name": "Steven"}];
    homeComponent.searchUser = new FormControl();
    homeComponent.searchUser.value = "ste";

    // Act
    const mockResponse = homeComponent.mapUsers(mockUsers);
    fixture.detectChanges();

    // Assert
    expect(mockResponse).toEqual(mockUsers);
  }));

});
我得到的业力错误:

失败:无法设置[object object]的属性值,它只有一个 吸气剂


不能直接设置窗体的值。必须使用patchValue或setValue方法,如下所示

homeComponent.searchUser.patchValue({[formControlName]:[formControlValue]})

在我的例子中,你的意思可能是这样的:homeComponent.searchUser.patchValue({[“searchUser”]:[“ste”]})@AngularM no,这在语法上毫无意义;它将是一个计算属性名和一个数组值。括号表示占位符,我想。patchvalue和setvalue在窗体实例上可用,而不是在formcontrol forminstance上。表示使用formbuilder或使用new FormGroup()创建的。是的括号是patchvalue方法中的占位符。您传递对象时,键作为formcontrol名称,值作为formcontrol值