无法解析 Class: (?) 的所有参数,尽管已提供

Posted

技术标签:

【中文标题】无法解析 Class: (?) 的所有参数,尽管已提供【英文标题】:Can't resolve all parameters for Class: (?) although it has been provided 【发布时间】:2018-11-29 18:22:58 【问题描述】:

我目前正在为使用ngxs 进行状态管理的服务编写一些测试用例。我似乎无法弄清楚下面的代码有什么问题:

// auth.service.ts
@Injectable(
    providedIn: 'root'
)
export class AuthService 
    @Select(SessionState) session$;
    constructor(private http: HttpClient, private store: Store) 
    




// session.state.ts
export interface SessionStateModel 
    user: User | null;
    token: string | null;
    state: 'authenticated' | 'guest' | 'invalid.credentials' | 'error' | 'pending';
    response?: HttpErrorResponse | string | any;


export const defaultSessionState: SessionStateModel = 
    user: null,
    token: null,
    state: 'guest',
    response: null
;

@State<SessionStateModel>(
    name: 'session',
    defaults: defaultSessionState
)
export class SessionState 
    constructor(private auth: AuthService) 
    



// session.state.spec.ts
describe('should handle login, logout and errors properly', () => 
    let store: Store;
    let backend: HttpTestingController;

    beforeEach(() => 
        TestBed.configureTestingModule(
            imports: [
                HttpClientTestingModule,
                NgxsModule.forRoot([SessionState])
            ],
            providers: [
                AuthService
            ]
        );

        backend = TestBed.get(HttpTestingController);
        store = TestBed.get(Store);
    );

    afterEach(() => 
        // After every test, assert that there are no more pending requests.
        backend.verify();
    );

    it('should handle successful login', () => 
        // oversimplified...
        expect(true).toBe(true);
    );
);

当我使用ng test 运行此程序时,业力返回以下异常: Error: Can't resolve all parameters for SessionState: (?).

这对我来说没有任何意义,因为我已经是 providing TestBed.configureTestingModule 中的 SessionState(即 AuthService)所必需的。我似乎无法弄清楚我在这里错过了什么?

【问题讨论】:

【参考方案1】:

在给出这个答案的时候,如果状态类注入了依赖项,ngxs 不能与 Ivy 一起使用(但请参阅下面的编辑)。您可以通过在tsconfig.json 中设置以下编译器选项来关闭 Ivy:


  "angularCompilerOptions": 
    "enableIvy": false
  

编辑: Ngxs 为 Ivy 提供了一个migration guide。按照本指南,除了 @State 装饰器之外,您还需要添加 @Injectable 装饰器:

@State<SessionStateModel>(
    name: 'session',
    defaults: defaultSessionState
)
@Injectable()
export class SessionState 
    constructor(private auth: AuthService) 
    

【讨论】:

感谢您的回答。在我提出问题时,我没有使用 Ivy,但是当我升级到 9 时会记住它! :)【参考方案2】:

您可能缺少@Injectable()SessionState 服务。这也可能引发错误。

@Injectable()
export class SessionState 
    constructor(private auth: AuthService) 
    

【讨论】:

我最初也是这样,但事实并非如此。问题是 AuthService 没有被注入到 SessionState 类中 - 而不是相反,AuthService 有一个 Injectable 装饰器。

以上是关于无法解析 Class: (?) 的所有参数,尽管已提供的主要内容,如果未能解决你的问题,请参考以下文章

无法获得 Angular CLI 版本,尽管所有要求都已安装?

无法解析 xyz 的所有参数:(?, ?) 自 Angular2 CLI 升级以来

cx_Oracle 无法在 Python 3.9 中导入,尽管一切都已正确路径并且所有必需的部分都在 64 位上运行

尽管已安装,但无法在 .py 脚本中导入 plotly.express

nslookup 报告“无法解析 '(null)':名称无法解析”,尽管它成功解析了 DNS 名称

NGXS 错误:无法解析 TranslationEditorState 的所有参数:(?)