如何使用模拟服务在Angular中对(非组件)支持类进行单元测试

如何使用模拟服务在Angular中对(非组件)支持类进行单元测试,angular,unit-testing,angular-test,Angular,Unit Testing,Angular Test,我不太明白如何使用Jasmine对支持类的一些方法进行单元测试。被测试的类是一个单一的纯类型脚本类,它在启动时由其中一个服务初始化,然后通过调用AccountsManager.getInstance()在应用程序的生命周期中由各种组件使用 下面是该类的构造函数和初始值设定项,称为AccountsManager: export class AccountsManager { private static instance: AccountsManager; static init

我不太明白如何使用Jasmine对支持类的一些方法进行单元测试。被测试的类是一个单一的纯类型脚本类,它在启动时由其中一个服务初始化,然后通过调用
AccountsManager.getInstance()
在应用程序的生命周期中由各种组件使用

下面是该类的构造函数和初始值设定项,称为AccountsManager:

export class AccountsManager {
    private static instance: AccountsManager;

    static initialize(accountService: AccountService) {
        if (!this.instance) { this.instance = new AccountsManager(accountService) }

    }

    static getInstance(): AccountsManager {
        if (!this.instance || !this.instance.isInitialized) {
            throw new Error("AccountsManager.getInstance(): AccountManager has not been initialized");
        }
        return this.instance;
    }

    //methods...
 }
我根据各种参考文档中的内容尝试了Jasmine测试,但是我看到的文档展示了如何测试角度组件,而不是任意类

问题是获取AccountService的实例以初始化AccountsManager。实例化真正的AccountService很复杂,所以我想使用模拟服务,因为我想运行的单元测试无论如何都不依赖AccountService

我找到了一个如何使用模拟服务测试组件的示例,但我猜它们是测试POTC的错误设置

不管怎么说,这是我试过的,只是想看看

fdescribe('AccountsManager', () => {

    let fixture: ComponentFixture<AccountsManager>
    let mockAccountService = {  }
    let component : AccountsManager;
    beforeEach(() =>{
        TestBed.configureTestingModule({
            declarations: [AccountsManager],
            providers: [{provide: AccountService, useValue:  mockAccountService}]
        })
        fixture= TestBed.createComponent(AccountsManager);
        component = fixture.componentInstance;
    })
});
fdescribe('AccountsManager',()=>{
let夹具:组件夹具
让mockAccountService={}
let组件:AccountsManager;
在每个之前(()=>{
TestBed.configureTestingModule({
声明:[AccountsManager],
提供程序:[{提供:AccountService,useValue:mockAccountService}]
})
fixture=TestBed.createComponent(AccountsManager);
组件=fixture.componentInstance;
})
});
我猜这是行不通的,因为“AccountsManager”只是一个类,它不是一个角度组件,但无论如何,它现在在
TestBed.createComponent(AccountsManager)
上失败了,错误消息是AccountsManager的构造函数是私有的(按设计)createComponent希望有一个公共构造函数,但我猜还是有一个更直接的方法来实现我想要的


如果我只想用一个虚拟AccountsService实例初始化这个类,那么最简单的方法是什么,这样我就可以运行我的测试了?

如果我得到了你的要求,你需要这样的东西:

description('AccountsManager',()=>{
让mockAccountService={};
let accountsManager:accountsManager;
在每个之前(()=>{
TestBed.configureTestingModule({
提供程序:[{提供:AccountService,useValue:mockAccountService}]
});
AccountsManager.initialize(TestBed.inject(AccountService));
accountsManager=accountsManager.getInstance();
});
它('应该是单身',()=>{
AccountsManager.initialize(TestBed.inject(AccountService));
const am=AccountsManager.getInstance();
预期(am==accountsManager)
.withContext('AccountsManager不是单例')
.toBeTrue();
});
});

如果我得到了你想要的东西,你需要这样的东西:

description('AccountsManager',()=>{
让mockAccountService={};
let accountsManager:accountsManager;
在每个之前(()=>{
TestBed.configureTestingModule({
提供程序:[{提供:AccountService,useValue:mockAccountService}]
});
AccountsManager.initialize(TestBed.inject(AccountService));
accountsManager=accountsManager.getInstance();
});
它('应该是单身',()=>{
AccountsManager.initialize(TestBed.inject(AccountService));
const am=AccountsManager.getInstance();
预期(am==accountsManager)
.withContext('AccountsManager不是单例')
.toBeTrue();
});
});

需要澄清的是:您是否有一个组件和一个同名的普通类,
AccountsManager
?如果是这样,您的项目就有问题。如果
AccountsManager
不是一个组件,您不应该使用
createComponent
来实例化它。测试床的存在基本上是为了实例化它组件并提供注入器+更改检测机制。考虑到
AccountsManager
不是角度组件,我将尝试回答您的问题。请澄清:您是否有一个组件和一个普通类具有相同的名称,
AccountsManager
?如果是这种情况,则您的项目有问题。如果
AccountsManager
不是一个组件,您不应该使用
createComponent
对其进行实例化。测试台的存在基本上是为了实例化角度组件,并提供喷油器+变化检测机制。考虑到
AccountsManager
不是角度组件,我将尝试回答您的问题。