如何在 ui5 中存根视图模型?

How to stub view model in ui5?

我是 qunit + sinon.js 的新手,我想为函数 onMultiSelectPress 编写单元测试,所以我需要模拟:

this.myController._oList

this.myController.getResourceBundle()

this.myController.getModel("masterView")

对吧?

我无法获取 getModel("masterView") 的存根,有什么建议吗?

onInit : function () {
    var oList = this.byId("list"),
        oViewModel = this._createViewModel();   
    this._oList = oList;
    this.setModel(oViewModel, "masterView");    
},

_createViewModel : function() {
    return new JSONModel({
        isFilterBarVisible: false,
        filterBarLabel: "",
        delay: 0,
        title: this.getResourceBundle().getText("masterTitleCount", [0]),
        noDataText: this.getResourceBundle().getText("masterListNoDataText"),
        sortBy: "Name",
        groupBy: "None",
        listMode: "SingleSelectMaster",
        showDeleteButton: false
    });
},

getModel : function (sName) {
    return this.getView().getModel(sName);
},

onMultiSelectPress : function () {
    var oMasterViewModel = this.getModel("masterView");

    switch(this._oList.getMode()) {
        case "MultiSelect":
            oMasterViewModel.setProperty("/listMode", "SingleSelectMaster");
            oMasterViewModel.setProperty("/showDeleteButton", false);
            break;
        case "SingleSelectMaster":
            oMasterViewModel.setProperty("/listMode", "MultiSelect");
            oMasterViewModel.setProperty("/showDeleteButton", true);
            break;
    }
},

beforeEach中添加一个oViewStub,并设置一个空的JSON模型用于测试。

    QUnit.module("MasterController", {
        beforeEach: function() {
            this.oMasterController = new MasterController();
            this.models = {};
            var oViewStub = {
                setModel: function(model, name) {
                    this.models[name] = model;
                }.bind(this),
                getModel: function(name) {
                    return this.models[name];
                }.bind(this)
            };
            sinon.stub(Controller.prototype, "getView").returns(oViewStub);
        },

        afterEach: function() {
            this.oMasterController.destroy();
            jQuery.each(this.models, function(i, model) {
                model.destroy();
            });
            Controller.prototype.getView.restore();
        }
    });

    QUnit.test("test onMultiSelectPress() ", function(assert) {
        var oMasterController = this.oMasterController;
        var oModel = new JSONModel();
        oMasterController.setModel(oModel, "masterView");
        var oMasterViewModel = oMasterController.getModel("masterView");

        oMasterController._oList = new sap.m.List();
        sinon.stub(oMasterController._oList, "getMode").returns("MultiSelect");
        oMasterController.onMultiSelectPress();
        assert.strictEqual(oMasterViewModel.getProperty("/listMode"), "SingleSelectMaster", "Did change list mode to SingleSelectMaster");
        assert.strictEqual(oMasterViewModel.getProperty("/showDeleteButton"), false, "Did hide the delete button");

        oMasterController._oList.getMode.restore();
        sinon.stub(oMasterController._oList, "getMode").returns("SingleSelectMaster");
        oMasterController.onMultiSelectPress();
        assert.strictEqual(oMasterViewModel.getProperty("/listMode"), "MultiSelect", "Did change list mode to MultiSelect");
        assert.strictEqual(oMasterViewModel.getProperty("/showDeleteButton"), true, "Did show the delete button");

        oMasterController._oList.destroy();
    });