【问题标题】:Unit testing with Jasmine: code in beforeEach() not seen by test's spyOn()使用 Jasmine 进行单元测试:测试的 spyOn() 看不到 beforeEach() 中的代码
【发布时间】:2012-01-11 19:22:55
【问题描述】:

单元测试新手,尤其是 Jasmine。

我在beforeEach() 回调中设置了一个变量,但它似乎不适用于第二次测试。它应该在其上下文中的 每个 测试之前触发初始化内容,对吗?我确定我的spyOn() 电话是罪魁祸首,但我不知道如何解决。

评论解释通过和失败:

describe("Test suite for my library", function () {
  var html,
      body,
      play,
...

  // custom matcher...
  beforeEach(function () {
    this.addMatchers({
      toBeInstanceOf : function (constructr) {
        return this.actual instanceof constructr;
      });
    });
  });

  describe("Within the Button object", function () {

    beforeEach(function () {
      play = new Button("play", false);
    });

    describe("play", function () {

      // This test passes, as expected...
      it("should be an instance of the Button object", function () {
        expect(play).toBeInstanceOf(Button);
      });

    });

    describe("play.name", function () {

      // This test failed with the message
      // "Expected spy Button to have been called
      //  with [ 'play', false ] but it was never called."
      it("should be the first argument passed to the Button constructor", function () {
        spyOn(window, "Button");
        play = new Button("play", false); // ...until I added this line. Now it passes.
        expect(window.Button).toHaveBeenCalledWith("play", false);
      });

      // This test passes, even if the one above fails.
      it("should be 'play'", function () {
        expect(play.name).toBe("play");
      });

    });

  });
});

documentation 解释了 spyOn() 的用法,而不是上下文,所以我无法判断我是否创建了错误,或者我是否在不知不觉中利用了某个功能。

如果有人认为它对诊断有任何影响,我可以发布构造函数,但我可以向你保证它非常简单。

我确信这是一个使用一些基本单元测试概念的简单解决方法,我必须通过艰苦的方式学习。提前致谢。

P.S. 我意识到我在那个失败的规范中测试的不是我所描述的。我正在阅读 API 指南,寻找一种在函数调用中获取参数数组的方法,因此我可以对 arguments[0] 进行特定测试。提示表示赞赏,但不是必需的。我会想办法的。

【问题讨论】:

    标签: javascript unit-testing jasmine


    【解决方案1】:

    简短回答:不,之前每个和间谍都不是不相容的

    如果您希望间谍知道通话的情况,您必须在通话前进行间谍活动。如果您不想干扰其默认行为,可以使用 spyOn(object, 'function').andCallThrough()。

    长答案:伪造/模拟/存根/间谍框架通常的工作方式是将您正在调用的方法替换为模拟框架可以控制的方法。在被间谍替换之前对该函数的任何调用都无法观察到。这是一件好事,虽然有点不方便,

    【讨论】:

    • 切换顺序和CallThrough() 成功了。 +1 并接受。非常感谢。
    • @parisminton 。我已经发布了关于 jamsine 测试用例的问题。 stackoverflow.com/questions/26583283/… .. 如果你能提供帮助,真的很感激。问候
    【解决方案2】:

    它的原因是你在调用后监视 window.Button。我不完全确定 spy 做了什么,但毕竟它用另一个函数取代了你监视的函数,它可以检查函数是否被调用以及传递了什么参数。在开始测试之前创建 Button 时,会调用原始的 window.button 函数。然后你用 spy 替换函数并测试 spy 被调用,所以你的测试必须失败。

    似乎要么在测试本身中创建您的 Button,要么在您在 beforeEach 函数中调用 new Button 之前创建您的间谍。

    【讨论】:

    • +1。事实上,我将 spyOn() 调用移到了 beforeEach() 函数中,它完全按照您的建议工作。谢谢。
    猜你喜欢
    • 2016-03-29
    • 2021-09-10
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2023-01-13
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多