- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用以下代码模拟与 authservice 的依赖关系:
login.component.spec
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();
});
});
login.component
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() {
}
}
但是如果我查看结果,我会不断收到以下错误:
Error: StaticInjectorError(DynamicTestModule)[AuthService -> AngularFireAuth]: StaticInjectorError(Platform: core)[AuthService -> AngularFireAuth]: NullInjectorError: No provider for AngularFireAuth! in http://localhost:9876/_karma_webpack_/vendor.js (line 59376)
知道如何解决这个问题吗?
最佳答案
我已在 Stackblitz 中重现了您的问题.目前在 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
.
要重现您的错误,只需注释掉我对 MockAuthService 的新声明,然后取消注释掉您原来的声明。您在上面描述的错误将再次出现。
这样做的原因是,当您扩展一个类时,您将获得现有类的所有对象、属性、方法等包括构造函数。在你的情况下,我很确定原始 AuthService
的构造函数类已注入(inject) AngularFireAuth,就像我在文件 support.service.ts
中的 Stackblitz 中所做的那样我在哪里实现了 AuthService
的 stub .当您扩展类,然后在覆盖组件时将其注入(inject)到 TestBed 中,然后尝试创建组件时,它会尝试在该原始类中执行构造函数。但是,没有为 AngularFireAuth 提供任何提供程序,因此它引发了您看到的错误。简单地将 AngularFireAuth 添加到 providers 数组并不是正确的解决方案,因为您要测试的是组件,而不是服务。
当我想将模拟类注入(inject)测试套件时,就像您在此处所做的那样,我通常使用 implements
然后 Partial<>
这样我就不必实现原始类的所有方法和属性,并且我只模拟了我想要的东西,而不是拖延原始类的实现细节。
关于 implements
之间的差异有很好的讨论和 extends
here .
一些进一步的说明:
Router
添加另外两个模拟服务和 GithubService
.请注意,我做这些是作为 spy 而不是服务类模拟,只是为了展示一种不同的方式来做这些。我注意到你已经导入了 NO_ERRORS_SCHEMA
,可能是为了避免必须定义这些。我自己不使用该模式,尽管它看起来相当流行,因为我不想掩盖错误——我宁愿让它们暴露并修复它们。 :)signInWithGithub()
的一部分来采取下一步行动方法。希望对您有所帮助。
关于angular - 模拟与服务的依赖关系导致 firebase 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53823681/
我正在尝试使用 Spark 从 Cassandra 读取数据。 DataFrame rdf = sqlContext.read().option("keyspace", "readypulse
这是代码: void i_log_ (int error, const char * file, int line, const char * fmt, ...) { /* Get erro
我必须调试一个严重依赖 Gtk 的程序。问题是由于某些原因,在使用 GtkWindow 对象时开始出现许多运行时警告。问题是,即使 Gtk 提示严重错误,它也不会因这些错误而中止。我没有代码库的更改历
我正在尝试从已有效编译和链接的程序中检索二进制文件。我已经通过 GL_PROGRAM_BINARY_LENGTH 收到了它的长度。该文档说有两个实例可能会发生 GL_INVALID_OPERATION
我有一个托管在 Azure 环境中的服务。我正在使用控制台应用程序使用该服务。这样做时,我得到了异常: "The requested service, 'http://xxxx-d.yyyy.be/S
我有以下代码,它被 SEGV 信号杀死。使用调试器表明它被 main() 中的第一个 sem_init() 杀死。如果我注释掉第一个 sem_init() ,第二个会导致同样的问题。我试图弄清楚是什么
目前我正在编写一个应用程序(目标 iOS 6,启用 ARC),它使用 JSON 进行数据传输,使用核心数据进行持久存储。 JSON 数据由 PHP 脚本通过 json_encode 从 MySQL 数
我对 Xamarin.Forms 还是很陌生。我在出现的主页上有一个非常简单的功能 async public Task BaseAppearing() { if (UserID
这是我的代码的简化版本。 public class MainActivity extends ActionBarActivity { private ArrayList entry = new Arr
我想弄明白为什么我的两个 Java 库很难很好地协同工作。这是场景: 库 1 有一个类 A,其构造函数如下: public A(Object obj) { /* boilerplate */ } 在以
如果网站不需要身份验证,我的代码可以正常工作,如果需要,则在打印“已创建凭据”后会立即出现 EXC_BAD_ACCESS 错误。我不会发布任何内容,并且此代码是直接从文档中复制的 - 知道出了什么问题
我在使用 NSArray 填充 UITableView 时遇到问题。我确信我正在做一些愚蠢的事情,但我无法弄清楚。当我尝试进行简单的计数时,我得到了 EXC_BAD_ACCESS,我知道这是因为我试图
我在 UITableViewCell 上有一个 UITextField,在另一个单元格上有一个按钮。 我单击 UITextField(出现键盘)。 UITextField 调用了以下方法: - (BO
我有一个应用程序出现间歇性崩溃。崩溃日志显示了一个堆栈跟踪,这对我来说很难破译,因此希望其他人看到了这一点并能为我指出正确的方向。 基本上,应用程序在启动时执行反向地理编码请求,以在标签中显示用户的位
我开发了一个 CGImage,当程序使用以下命令将其显示在屏幕上时它工作正常: [output_view.layer performSelectorOnMainThread:@selector(set
我正在使用新的 EncryptedSharedPreferences以谷歌推荐的方式上课: private fun securePrefs(context: Context): SharedPrefe
我有一个中继器,里面有一些控件,其中一个是文本框。我正在尝试使用 jquery 获取文本框,我的代码如下所示: $("#").click(function (event) {}); 但我总是得到 nu
在以下场景中观察到 TTS 初始化错误,太随机了。 已安装 TTS 引擎,存在语音集,并且可以从辅助功能选项中播放示例 tts。 TTS 初始化在之前初始化和播放的同一设备上随机失败。 在不同的设备(
maven pom.xml org.openjdk.jol jol-core 0.10 Java 类: public class MyObjectData { pr
在不担心冲突的情况下,可以使用 MD5 作为哈希值,字符串长度最多为多少? 这可能是通过为特定字符集中的每个可能的字符串生成 MD5 哈希来计算的,长度不断增加,直到哈希第二次出现(冲突)。没有冲突的
我是一名优秀的程序员,十分优秀!