javascript - 使用 Jasmine (JavaScript) 测试委托(delegate)回调

标签 javascript testing jasmine

我有一个简单的 JavaScript 函数,它使用两个委托(delegate)来(异步地)取回一个值:

function getMyUserName() {
    context.load(user);
    context.executeQueryAsync(onGetMyUserNameSuccess, onGetMyUserNameFail);
}
function onGetMyUserNameSuccess() {
    return user.get_title();
}
function onGetMyUserNameFail(sender, args) {
    return args.get_message();
}

“上下文”和“用户”变量已经设置和初始化,第一个委托(delegate)(“onGetMyUserNameSuccess”)得到正确答案。问题是如何使用 Jasmine 测试“getMyUserName”函数?如果我使用“运行”,我无法知道代表的响应(我也看不到任何方式来知道代表是否被调用)。我试图设置 spy 来 mock 代表,但可能我没有正确设置(我只是从 Jasmine 开始)。 任何帮助都将非常受欢迎。 提前致谢, 古斯塔沃

最佳答案

在大多数情况下,当您必须使用异步代码时,您应该自己调用该函数。但不是直接,而是以您的代码调用它的方式。因此,在您的情况下,监视 context.executeQueryAsync 并使用 spy.mostRecentCall.args 获取对该函数的引用,然后调用它们。

var async = jasmin.spyOn(context, 'executeQueryAsync');

async.mostRecentCall.args[0]()

var args = {get_message: jasmine.createSpy()}
async.mostRecentCall.args[1]({}, args);
expect(args.get_message.toHaveBeenCalled());

请注意,有 sinon具有 bunch of methodes 的框架自动调用回调

关于javascript - 使用 Jasmine (JavaScript) 测试委托(delegate)回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16175952/

相关文章:

javascript - 运行目录中的所有文件

ios - 打破 Cocoa iOS 中 MVC 对象之间的循环依赖

javascript - 无法测试是否在 Protractor 中选中了复选框

javascript - 如何在 ES6 类中创建 "public static field"?

javascript - 禁用下拉框中特定选择的文本字段

c++ - 在 googletest 中循环测试用例

testing - 您的测试数据应该与实时数据采用相同的形式吗?

jasmine - 如何使用 jasmine Expect 验证表行中的值未排序

angularjs - Jasmine 单元测试 $timeout (expect($timeout).toHaveBeenCalledWith(n);)

javascript - getScript 函数工作但没有得到一些 css