- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在针对单例服务进行角度单元测试。我有一个在根模块中提供的 UserService 是应用程序中的单例,我想编写一个单元测试来检查 UserService 的实例在整个应用程序中是否相同。我可以做类似下面的事情,但它会检查组件和 Testbed 实例。有什么办法可以为所有功能模块编写一个单元测试来检查我们是否有相同的实例?感谢任何帮助。
import { TestBed, ComponentFixture, inject } from '@angular/core/testing';
import { LoginComponent } from './login.component';
import { AuthService } from "./auth.service";
class MockAuthService extends AuthService {
isAuthenticated() {
return 'Mocked';
}
}
describe('Component: Login', () => {
let component: LoginComponent;
let fixture: ComponentFixture<LoginComponent>;
let testBedService: AuthService;
let componentService: AuthService;
beforeEach(() => {
// refine the test module by declaring the test component
TestBed.configureTestingModule({
declarations: [LoginComponent],
providers: [AuthService]
});
// Configure the component with another set of Providers
TestBed.overrideComponent(
LoginComponent,
{ set: { providers: [{ provide: AuthService, useClass: MockAuthService }] } }
);
// create component and test fixture
fixture = TestBed.createComponent(LoginComponent);
// get test component from the fixture
component = fixture.componentInstance;
// AuthService provided to the TestBed
testBedService = TestBed.get(AuthService);
// AuthService provided by Component, (should return MockAuthService)
componentService = fixture.debugElement.injector.get(AuthService);
});
it('Service injected via inject(...) and TestBed.get(...) should be the same instance',
inject([AuthService], (injectService: AuthService) => {
expect(injectService).toBe(testBedService);
})
);
});
最佳答案
我觉得这属于“不测试框架”的大类。
如果您使用 @Injectable({ providedIn: 'root' })
装饰器来装饰服务类型,您可以保证每个需要实例的组件或服务将获得相同的实例。从 Angular 6(或 5?我不记得了)开始,您通常不应该为模块中的服务添加 providers
。使用 providedIn
的默认行为符合您的要求。请参阅此以供引用:https://angular.io/guide/providers .
每个提供的服务都作为单例解析的保证来自 Injector 的单元测试,原则上和实践上你都不应该保证:运行单元测试时你没有使用相同的依赖项注入(inject)基础设施比运行应用程序时!因此,您的测试将毫无意义:您将测试 TestBed,而不是运行时注入(inject)器。
并且您不能保证代码库中的某个人会添加一个{ provide: AuthService, useClass: AuthService }
并实例化另一个 AuthService。
我不知道您的确切要求,但是:
providedIn: 'root'
,删除每个功能模块中的每个 provider
,然后您可以开始了。默认行为符合您的要求。@Injectable({ providedIn: 'root' })
export class AuthService {
private static initialized = false;
constructor() {
if (isDevMode() && AuthService.initialized) {
throw new Error('AuthService: instance already initialized');
}
AuthService.initialized = true;
}
}
只是,不要对其进行单元测试。
关于typescript - 单例服务的 Angular 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65319511/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!