【问题标题】:Can't resolve all parameters for Class: (?) although it has been provided无法解析 Class: (?) 的所有参数,尽管已提供
【发布时间】: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)所必需的。我似乎无法弄清楚我在这里错过了什么?

【问题讨论】:

    标签: angular dependency-injection ngxs


    【解决方案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 装饰器。
    猜你喜欢
    • 2020-12-09
    • 2017-02-03
    • 2019-05-22
    • 1970-01-01
    • 2017-02-12
    • 2017-08-12
    • 1970-01-01
    • 2017-09-26
    • 2018-03-24
    相关资源
    最近更新 更多