Как вы тестируете модуль, чтобы такие методы, как ok() были вызваны в диалоге aurelia с использованием jasmine?

Как мне пройти модульное тестирование метода, вызывающего DialogController? Я хочу проверить это this.controller.ok() назывался.

ReprocessLotDialog.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' is not a function (evaluating 'this.controller.ok({ reprocessLot: this.model })')

Насколько я понимаю, я прохожу DialogController через DI в container а также container.get(ReprocessLotDialog) вводит DialogController в ctor.

Я также пытался container.registerInstance(DialogController,{"dialogController":DialogController}); но это тоже не работает.

Большое спасибо

2 ответа

Решение

Ваши юнит-тесты не должны использовать контейнер DI. Вы просто новый экземпляр ReprocessLotDialog и пройти в макете 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();
  });
});

Вы также можете подумать, если тестирование, если вы не должны просто тестировать, если commitReprocessingLot был вызван вместо проверки того, что он вызывает метод, который является единственным, что он делает (по крайней мере, в вашем примере).

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

    let sut = new ReprocessLotDialog(dialogController);

    spyOn(sut, "commitReprocessingLot");

    sut.commitIncompleteBags();
    expect(su.commitReprocessingLot).toHaveBeenCalled();
  });
});

Вы можете определенно заглушить контроллер или просто шпионить за методом экземпляра следующим образом:

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();
    });
});

По сути, вы должны иметь возможность создать экземпляр в вашем контейнере контроллера, который будет передан, и вы можете следить за методом непосредственно в экземпляре.

Другие вопросы по тегам