如何使用jasmine对aurelia对话框中调用ok()等方法进行单元测试?

如何使用jasmine对aurelia对话框中调用ok()等方法进行单元测试?,aurelia,aurelia-dialog,Aurelia,Aurelia Dialog,如何对调用DialogController的方法进行单元测试?我想测试是否调用了this.controller.ok() rewrotdialog.js @inject(DialogController) export class ReprocessLotDialog { constructor(dialogController) { this.controller = dialogController; } commitReprocessingLot

如何对调用DialogController的方法进行单元测试?我想测试是否调用了
this.controller.ok()

rewrotdialog.js

@inject(DialogController)
export class ReprocessLotDialog {
    constructor(dialogController) {
        this.controller = dialogController;
    }


    commitReprocessingLot() {    
        this.controller.ok({
            reprocessLot: this.model
        });
    }    

    commitIncompleteBags(){
       ... do stuff ....
       this.commitReprocessingLot();
    }
}
myDialog.spec.js
我已经尝试过了,但无法让它工作

describe("The ReprocessLotDialog module", ()=> {
    let sut;

    beforeEach(()=> {
        var container = new Container().makeGlobal();
        container.registerInstance(DialogController,controller => new DialogController());
        sut = container.get(ReprocessLotDialog);
    });


     it("commitReprocessingLot() should call controller.ok", (done)=> {    
        spyOn(sut, "controller.ok");

        sut.commitIncompleteBags();
        expect(sut.controller.ok).toHaveBeenCalled();
        done();
    });
});
测试失败,出现
TypeError:“undefined”不是函数(评估“this.controller.ok({rewreplot:this.model})”)

据我所知,我正在通过DI将
DialogController
传递到
container
中,并且
container.get(reducelotdialog)
将DialogController注入到ctor中

我也试过了
container.registerInstance(DialogController,{“DialogController”:DialogController})但这也不起作用


非常感谢您的单元测试不应该使用DI容器。您只需新建一个
dialog
实例,并传入您创建的
DialogController
模拟。如果你用的是茉莉花,它看起来像这样:

describe("The ReprocessLotDialog module", ()=> {
 it("commitReprocessingLot() should call controller.ok", ()=> {    
    let dialogController = {
          ok: (arg) = { }
        };

    spyOn(dialogController, "ok");

    let sut = new ReprocessLotDialog(dialogController);

    sut.commitIncompleteBags();
    expect(dialogController.ok).toHaveBeenCalled();
  });
});

您可能还想考虑如果测试不应该只是测试,如果调用了代码>委托RealRealPosialPox<代码>,而不是检查它调用它唯一的方法(至少在您的例子中)。< /P>


您完全可以删除控制器,也可以像这样监视实例方法-

describe("The ReprocessLotDialog module", ()=> {
    let container;
    let sut;
    let controller;

    beforeEach(()=> {
        container = new Container().makeGlobal();
        controller = container.get(DialogController);
        sut = container.get(ReprocessLotDialog);
    });


     it("commitReprocessingLot() should call controller.ok", (done)=> {    
        spyOn(controller, 'ok');
        sut.commitIncompleteBags();
        expect(controller.ok).toHaveBeenCalled();
        done();
    });
});

基本上,您应该能够在控制器的容器中创建一个实例,该实例将被传入,并且您可以直接在该实例上监视该方法。

您和Patrick的回答都非常有用!我认为测试时必须使用DI。有关于aurelia测试的最佳实践的文档吗?
describe("The ReprocessLotDialog module", ()=> {
    let container;
    let sut;
    let controller;

    beforeEach(()=> {
        container = new Container().makeGlobal();
        controller = container.get(DialogController);
        sut = container.get(ReprocessLotDialog);
    });


     it("commitReprocessingLot() should call controller.ok", (done)=> {    
        spyOn(controller, 'ok');
        sut.commitIncompleteBags();
        expect(controller.ok).toHaveBeenCalled();
        done();
    });
});