【问题标题】:Angular2 Test (jasmine) mocking Service. Can't resolve all parameters for Service: (?, ?)Angular2 测试(茉莉花)模拟服务。无法解析服务的所有参数:(?, ?)
【发布时间】:2017-10-26 15:25:05
【问题描述】:

我正在尝试模拟以下服务来测试我的组件:

生产:

@Injectable()
export class UserService extends DtoService {
    // some not relevant stuff.
}

@Injectable()
export abstract class DtoService {
    constructor(private http: Http, private authHttp: AuthHttp) {}

    get() {
        return this.http.get(...);
    }
}

@Component({
    selector: 'users',
    templateUrl: 'users.component.html',
    styleUrls: ['users.scss'],
    providers: [UserService]
})
export class UsersComponent implements OnInit, OnDestroy {
    constructor(private userService: UserService) {}
    // etc
}

测试:

class MockUserService {
    public get(): Observable<User> {
        return Observable.of(new User({id: 1, email: 'user1@test.com'}));
    }
}

beforeEach(async(() => {

    TestBed
        .configureTestingModule({
            declarations: [UsersComponent],
            providers: [{provide: UserService, useClass: MockUserService}]
        });
    this.fixture = TestBed.createComponent(UsersComponent);

}));

它应该是最经典的用例,对吧(见angular test doc)?但在这里我得到了错误:

Can't resolve all parameters for UserService: (?, ?).

但是 UserService 根本不应该被实例化。我究竟做错了什么? 感谢社区!

【问题讨论】:

    标签: angular testing mocking


    【解决方案1】:

    您必须在存根服务的构造函数中提供 private http: Http, private authHttp: AuthHttp 或它的一些模拟服务。

    【讨论】:

    • 它实际上提出了更多关于angular的测试系统的问题: - 为什么angular会尝试实例化存根服务,如果它被存根服务替换? - 我的存根服务是否应该具有与存根服务相同的构造函数签名? - Angular 不应该像在生产中那样使用 @Injectable() 自己找到 http 和 authHttp 吗? - 如何将 null、null 的值传递给构造函数?谢谢!
    • 是的,你必须得到相同的构造函数。这就是为什么当您获得如此痛苦的存根服务时,我可以建议监视它们而不是存根它们。角度文档对间谍服务非常清楚,您可以查看它来解决您的问题
    猜你喜欢
    • 1970-01-01
    • 2015-08-11
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    相关资源
    最近更新 更多