单元测试jqgrid动作

Unit test jqgrid action

我需要验证是否使用 EmberJS 中的 mocha 单元测试调用了 jqxgrid 的 'rowClicked' 操作。我初始化了一个网格,可以验证它是否已呈现,行和 headers 已呈现,但我卡在 rowclick 事件上。我使用 jQuery 来模拟对这样一行的点击:

this.$('#row0grid_testgrid').trigger('click');

我的网格代码像这样监听 rowClick 事件:

this.grid().on('rowclick', function(evt) {
        // My code here
    });

我如何验证它是否被调用? 谢谢

你能做这样的事情吗 - 模拟函数?

/*** in your unit test ***/
//... get your grid object ...
const gridComponent = ....

// save the original function to assign it later back
const originalOn = gridComponent.on;

// now mock the on function
gridComponent.on = function(actionName, handler){
assert.ok(true, "on() function has been called");

assert.equal(actionName, "rowclick", "the action on which on() function has been triggered is correct");
}

// execute tested context
this.$('#row0grid_testgrid').trigger('click');

// tidy up
gridComponent.on = originalOn;

这里有几件事要提:如果这有效,您将测试 on() 已被调用并且它是在正确的操作 'rowclick' 上触发的。但是,您仍然无法在事件函数中测试代码“// My code here”部分。

如果你想测试你的事件函数,你可以做的是从它调用匿名函数。让我告诉你我的意思:

/*** your component code ***/
// this will be called on "rowclick"
myComponentFunction: function(whatArgument){
  // My code here
}

....
const self = this;
this.grid().on('rowclick', function(evt) {
        // instead of pure code call a function
        const someParameters = "foo";
        self.myComponentFunction(someParameters);    
});
...

在你的单元测试中你还可以模拟 myComponentFunction:

// same unit test
....
const originalMyComponentFunction = gridComponent.myComponentFunction;

gridComponent.myComponentFunction = function(arg){
assert.ok(true, "myComponentFunction() has been called!");

// test argument, whatever
assert.equal(arg, "foo", "argument passed to myComponentFunction() from an event triggered on 'rowclick' is correct");
}

// tidy up myComponentFunction mock, too.
gridComponent.myComponentFunction = originalMyComponentFunction;

顺便说一句,设置模拟并整理它们的首选方法是将其放入 beforeEach() 和 afterEach(),查看 ember-cli testing guides

如果你有更好的测试方法,我也想向你学习:)