当前位置: 首页 > 知识库问答 >
问题:

如何恶搞观察使用spyOn?

别帅
2023-03-14

我写了通过超文本传输协议请求JSON的服务:

export class TodosService {
  constructor(private http: HttpClient) {}
  getTodos(): Observable<any> {
    return this.http.get<any>('https://jsonplaceholder.typicode.com/todos');
  }
}

从服务中为组件分配一个值:

export class TodosComponent implements OnInit {
  todos: any;
 
  constructor(private todosService: TodosService) {}
 
  ngOnInit() {
    this.todosService.getTodos().subscribe((todos) => {
      this.todos = todos;
    });
  }
}

我想测试一下。有一个单元测试:

describe('Page1Component', () => {
  let component: Page1Component;
  let fixture: ComponentFixture<Page1Component>;
  let spy: any;
  let todosService: TodosService;
 
  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [Page1Component],
      imports: [HttpClientModule],
      providers: [TodosService],
    }).compileComponents();
  });
 
  beforeEach(() => {
    fixture = TestBed.createComponent(Page1Component);
    component = fixture.componentInstance;
    fixture.detectChanges();
    todosService = TestBed.inject(TodosService);
  });
 
  it('should fill todos', () => {
    const todos = of([
      {
        completed: false,
        id: 1,
        title: 'title1',
        userId: 1,
      },
    ]);
    spyOn(todosService, 'getTodos').and.returnValue(todos);
    component.ngOnInit();
    expect(component.todos).toEqual(todos);
  });
});

我收到以下错误消息:

预期[对象({完成:假,id: 1,title:'title1',userId: 1})]等于可观察({_isScalar:假,_subscribe:函数})。

我尝试使用以下模拟:

const todos = [
  {
    completed: false,
    id: 1,
    title: 'title1',
    userId: 1,
  },
];

但在这种情况下,我得到了以下弹出在我的IDE:

类型为“{completed:boolean;id:number;title:string;userId:number;}[]”的参数不能分配给类型为“Observable”的参数。

请帮我修复这个单元测试

共有1个答案

松俊美
2023-03-14

您已经非常接近您正在尝试的内容,但是您正在比较一个数组和一个可观察到的匹配器。你需要比较观察到的结果

  const data = [
    {
      completed: false,
      id: 1,
      title: 'title1',
      userId: 1,
    },
  ]
  const todosObservable = of(data);
  spyOn(todosService, 'getTodos').and.returnValue(todosObservable);
  component.ngOnInit();
  expect(component.todos).toEqual(data);

上面的代码片段可以很好地工作,但我通常更喜欢使用HttpClientTestingModule,它很方便,因为您不必经常模拟服务

 类似资料:
  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 我来自同步编程背景,我很难理解可观察性。 这是我的服务/提供商的摘录(离子2项目) 我将从订阅它。关于这一点,我有几个问题。 > 即使我没有声明,上面的代码是否返回一个可观察/观察者? 响应是JSON。如何检查/处理JSON并执行一些操作,如 那就做吧 我认为应该在提供者类中完成。只是一个典型的提示/例子将是真棒。 当请求到达subscribe方法时,它是否真的发生了? 创建和返回Angular

  • 我正在进行一个项目,我们在该项目中遇到了线程问题。有一个问题使线程终止,并且线程无法自动重新启动,因此我们想更改当前的实现。我们想出了一个想法来运行一个观察者线程来管理文件处理线程。 请有人建议如何制作监视程序状态的线程以及如何执行此操作的想法。 编辑:所以基本上这就是发生的事情。用户上载一些写入文件共享的媒体文件。移动服务中运行的线程扫描媒体文件并附加到电子邮件。在此过程中,线程终止,无法将媒体

  • 我们知道有各种各样的应用程序,比如假冒我的GPS等等。但是这些应用程序使用开发者选项来激活模拟位置。检测模拟位置的应用程序通常会检查权限是否打开,并使用以下代码: 使用权限android: name="android.permission.ACCESS_MOCK_LOCATION"/ 我想知道是否有一种方法可以欺骗(更改)位置,而无需更改设备根目录或在Android上激活模拟位置设置。

  • 问题内容: 我一直在阅读Observer模式,以保持UI处于最新状态,但仍然看不到它的用途。即使在我的特定对象中通知了我的MainActivity然后运行update();方法我仍然无法使用Pet对象来获取更新值,因为该对象是在Oncreate中创建的…而我只是无法创建新对象,因为那时变量会有所不同..这是我的实施,它似乎不起作用。 观察者/ MainActivity 可观察/宠物 问题答案: 首

  • 问题内容: 回答“ 我如何知道数组内元素的值是否已更改”这一问题时受到启发 ,答案是使用 属性观察 器检查数组是否已被修改。 但是,如何确定属性查看器中集合类型中的已更新元素是什么?例如: 请注意,每次添加,更新或删除操作都已调用该代码,但是我如何才能确切知道受影响的元素是什么?有没有办法通过将数组除以 Property Observer 来实现这一目标? 我问的是Swift中的所有集合类型,因为