【问题标题】:Testing an async function with Jasmine in Meteor在 Meteor 中使用 Jasmine 测试异步函数
【发布时间】:2015-10-21 06:22:01
【问题描述】:

我在 Stackoverflow 上查看了其他几个与此相关的问题,但我似乎仍然无法解决我的问题。无论我做什么,似乎 Meteor.call 都没有被调用,或者我可以调用它(例如在下面的代码示例中),无论 jasmine.DEFAULT_TIMEOUT_INTERVAL 设置为,我继续收到以下错误:

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

这是我的 Jasmine 测试的样子:

it("Should be created and not assigned to anyone", function(done) {
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000000;

    // Confirm that the User Has Logged in
    expect(Meteor.userId()).not.toBeNull();

    var contact = null;
    var text = "This is a testing task";
    spyOn(Tasks, "insert");
    spyOn(Meteor, "call");

    Meteor.call('addTask', contact, text, function(error, result) {
      expect(error).toBeUndefined();
      expect(result).not.toBeNull();
      done();
    });

    expect(Meteor.call).toHaveBeenCalled();

  });

});

而我的 addTask 函数看起来像这样:

Meteor.methods({

  addTask: function (contact, text) {
     ... // addTask Code, removed for brevity
  },
});

我已经坚持了好几个星期了,任何人都可以提供的任何帮助都会非常有帮助。

【问题讨论】:

    标签: javascript testing meteor jasmine integration


    【解决方案1】:

    hander 内部的期望永远不会执行,因为 Jasmine 没有调用原始的 .call() 方法。为了让它工作,你应该写 spyOn(Meteor, "call").and.callThrough(); 而不是 spyOn(Meteor, "call");,它会在执行 Jasmine 间谍逻辑后调用原始处理程序。

    【讨论】:

    • 哇。那工作得很好。该函数现在抛出一个错误,但至少处理程序内部的期望最终被调用!谢谢你好先生!
    • 你能解释一下为什么我们只使用spyOn(Meteor, "call") 而不想callThrough吗?
    • 有时(实际上,我猜是大多数时候),人们想检查某个方法是否被调用,或者检查它被调用了多少次,他们用不同的测试来测试方法本身。
    • @MaximGritsenko 如果不调用实际实现,我将如何做到这一点?我可以存根实际实现的返回值并将存根值传递给回调函数吗?
    • @Joe,我不确定你的问题是什么。如果你监视一个方法并需要它实际执行,你添加.and.callThrought()。如果你只需要检查方法是否被调用而不执行它,你只需要 spy。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多