类型具有私有属性模拟服务单元测试 Angular 7 的单独声明

Ant*_*tWo 5 unit-testing ionic-framework angular

我正在尝试创建一个模拟服务,但我收到一个错误“类型有一个私有属性的单独声明”,对我来说,声明似乎是平等的,但没有不同,但它说不在错误中。我正在一个注入了服务的组件中进行此测试!!!是的,我想在这里用模拟测试来测试它。

我的模拟服务代码:

class MockDataservice {   
result: any;
constructor(private http: HttpClient){
    sendCodeToServer() {
     return this.result;
     } 
}

describe('HomePage', () => 
...
{
 ...  
beforeEach(() => { 
...
    service = new MockDataservice(http);  
    component = new HomePage(platform, service, splash, statusbar, barcode, alert, http, loading, router);
Run Code Online (Sandbox Code Playgroud)

原服务:

export class DataStorageService {
    result: any;
      constructor(private http: HttpClient) {
      }

sendToServer(data) {
const headers = new HttpHeaders().set('Content-Type', 'application/json');
   return new Promise((resolve, reject) => {
   this.http.post(endpoindURL, data, { headers: headers })
        .toPromise().then((data) => {
          resolve(data);
        }).catch((err) => {
          console.log(err);
          reject(err);
        });
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

组件中的服务使用:

export class HomePage {
barcodeScannerOptions: BarcodeScannerOptions;
    constructor(private platform: Platform, private **dataStorageService**: 
    DataStorageService,
    private splashScreen: SplashScreen,
    private statusBar: StatusBar, private barcodeScanner: BarcodeScanner, public 
    alertController: AlertController,
    private http: HttpClient, private loadingController: LoadingController, 
    private router: Router) {

    this.initializeApp();

    this.barcodeScannerOptions = {
          showTorchButton: true,
          showFlipCameraButton: true
        };
      }

    function doesSomething(){
    this.dataStorageService.sendToServer(data).then((res) => {
    }
Run Code Online (Sandbox Code Playgroud)

我在 home.spec 文件中的 word service 中收到错误

组件 = 新主页(平台、服务、启动画面、状态栏、条形码、警报、http、加载、路由器);

错误是

MockDataservice 不可分配给 //DataStorageService 类型的参数。类型有一个私有属性 http.ts 的单独声明

fjc*_*fjc 14

所以这是正在发生的事情的详尽答案。我构建了一个重现行为的最小示例:TypeScript Playground 上的 Broken example。您实际上可以看到完全相同的错误消息。

这是怎么回事?该Component预计实际的实例Service在其构造类。MockService 是不是一个Service。它只是巧合地具有相同的构造函数参数和相同的方法名称。编译器不知道两者实际上是兼容的(即实现相同的接口),因此会抛出错误。

我们如何解决这个问题?使用实际的面向对象抽象。由于ServiceMockService实际上是可以互换的,我们需要让编译器知道这一点。我们怎么做?通过让它们实现相同的接口

我们将只定义一个Service接口。我们将有一个ConcreteService,它包含默认行为,并实现Service. 我们还将有我们的MockService,它将实现相同的Service,但具有模拟行为:TypeScript playground 上的工作示例。,