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

用服务模拟dependecies导致firebase错误

董霖
2023-03-14
import { LoginComponent } from "./login.component";
import { ComponentFixture, inject, TestBed } from "@angular/core/testing";
import { async } from "q";
import { MatCardModule } from "@angular/material";
import { AuthService } from "../../services/auth/auth.service";
import { Log } from "@angular/core/testing/src/logger";
import { NO_ERRORS_SCHEMA } from "@angular/core";

class MockAuthService extends AuthService {
  isAuthenticated() {
    return "Mocked";
  }
}

describe("LoginComponent", () => {
  let component: LoginComponent;
  let fixture: ComponentFixture<LoginComponent>;
  let componentService: AuthService;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [LoginComponent],
      providers: [AuthService],
      imports: [MatCardModule]
    });
    TestBed.overrideComponent(LoginComponent, {
      set: { providers: [{ provide: AuthService, useClass: MockAuthService }] }
    });

    fixture = TestBed.createComponent(LoginComponent);
    component = fixture.componentInstance;
    componentService = fixture.debugElement.injector.get(AuthService);
  }));

  it("Service injected via component should be and instance of MockAuthService", () => {
    expect(componentService instanceof MockAuthService).toBeTruthy();
  });
});
import {Component, OnInit} from '@angular/core';

import {AuthService} from '../../services/auth/auth.service';
import {Router} from '@angular/router';
import {GithubService} from '../../services/github/github.service';
import {Errorcode} from './errorcode.enum';


@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.sass'],

})
export class LoginComponent implements OnInit {
  public loginError: string | boolean = false;

  constructor(public authService: AuthService, public router: Router, private data: GithubService) {
  }

  public signInWithGithub(): void {
    this.authService.loginwithGithubProvider()
      .then(this.loginError = null)
      .catch(err => {
        if (err === Errorcode.FIREBASE_POPUP_CLOSED) {
        this.loginError = 'The popup has been closed before authentication';
        }
        if (err === Errorcode.FIREBASE_REQUEST_EXESS) {
          this.loginError = 'To many requests to the server';
        }
      }
    );
  }

  public logout(): void {
    this.authService.logout();
  }

  ngOnInit() {
  }
}

我知道怎么解决这个问题吗?

共有1个答案

汲雅珺
2023-03-14

我已经把你的问题复制了一遍。在Stackblitz中,目前所有的测试都通过了,但是您会注意到,我已经将MockAuthService的声明注释掉了,如下所示:

// class MockAuthService extends AuthService {
//     isAuthenticated() {
//       return "Mocked";
//     }
// }

并将其替换为:

class MockAuthService implements Partial<AuthService> {
    isAuthenticated() {
      return "Mocked";
    }
    loginwithGithubProvider() {
      return new Promise((resolve, reject) => resolve())
    }
    logout() {}
}

需要注意的关键区别是,我将extends替换为implements

一些进一步的说明:

  • 我不得不为RouterGitHubService添加另外两个被模仿的服务。请注意,我是作为间谍而不是服务类模拟来做这些的,只是为了展示一种不同的方法来做这些。我注意到您已经导入了no_errors_schema,这可能是为了避免必须定义这些。我自己不使用该模式,尽管它似乎相当流行,因为我不想掩盖错误--我宁愿公开并修复它们。:)
  • 我还添加了另一个规范,只是为了说明如何通过测试SigninWithGitHub()方法的一部分来进行下一步。

我希望这能有所帮助。

 类似资料:
  • 我从单元测试开始。我对一个类做了更改,在这个类中我不注入SessionContext,这样我就可以在需要时进行查找。 现在,在我的测试中,我想注入它,这样我就可以模拟查找方法: 我觉得很奇怪,因为我拥有所需的所有依赖项(这段代码在真实的应用程序中工作)。 如何使用mockito模拟和注入SessionContext?(我无法改变嘲讽框架)。

  • 我是新的mockito和jUnit我不明白为什么我得到错误和如何模仿这个服务类方法 请帮我解决这个问题。是否需要模拟可分页和切片对象。为什么在嘲笑PartnerEventRepository之后,我也会说 “需要但未调用:partnerEventRepository.findAll(Cassandra页面请求[编号:0,大小5,排序:未排序,分页状态:null]) 莫基托

  • 问题内容: 我正在尝试执行此AJAX帖子,但是由于某些原因,我遇到了服务器500错误。我可以看到它在控制器中达到了断点。因此问题似乎出在回调上。任何人? 这是应该返回的字符串: 问题答案: 我怀疑服务器方法在通过断点后会引发异常。使用Firefox / Firebug或IE8开发人员工具查看您从服务器获得的实际响应。如果有异常,您将获得YSOD html,这应有助于您确定要查找的位置。 还有一件事

  • 我试图实现PhpPression转换一些文件,所以我有以下代码: 由于某种原因,这段代码正是导致500个内部服务器错误的原因。我已将错误报告设置为“全部”,但未显示任何错误。路径是正确的,我的根目录中有PhpOffice文件夹(public_html)和相应的子文件夹。 自动加载程序代码是这样加载的:

  • 我在我的本地主机上开发了一个laravel应用程序,运行非常好。我正试图使用Ubuntu 20.04上的nginx将其部署到AWS Lightsail实例上。我已经上传了我的laravel应用程序,并将nginx根目录更改为laravelapp/public。 主索引页(着陆页)工作正常,但我的路线都不工作(即 /login, /about等)。当我试图访问任何路线时,我得到一个404未找到错误。

  • 问题内容: 我正在尝试使用Google Firebase实时数据库。我的用户可以创建要在数据库中作为独立表以及在用户类中作为列表进行的事件。这是我用来将事件写入数据库以及发生异常的位置: 问题是,当我尝试保存创建的事件时,我开始收到消息,表明垃圾回收运行了几次,然后在该异常结束时打印了100次相同的异常,然后应用程序重新启动。 同样在顶部异常的末尾,我又得到了一个 在我的Event类中,我尝试存储