Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Jasmine进行单元测试:测试未看到beforeach()中的代码';s间谍_Javascript_Unit Testing_Jasmine - Fatal编程技术网

Javascript 使用Jasmine进行单元测试:测试未看到beforeach()中的代码';s间谍

Javascript 使用Jasmine进行单元测试:测试未看到beforeach()中的代码';s间谍,javascript,unit-testing,jasmine,Javascript,Unit Testing,Jasmine,新的单元测试一般和茉莉花特别 我在beforeach()回调中设置了一个变量,但在第二个测试中它似乎不起作用。它应该在其上下文中的每个测试之前触发初始化,对吗?我肯定是我的spyOn()呼叫造成的,但我不知道如何修复它 注释解释通过和失败的原因: describe("Test suite for my library", function () { var html, body, play, ... // custom matcher... beforeEa

新的单元测试一般和茉莉花特别

我在
beforeach()
回调中设置了一个变量,但在第二个测试中它似乎不起作用。它应该在其上下文中的每个测试之前触发初始化,对吗?我肯定是我的
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");
      });

    });

  });
});
说明了
spyOn()
的用法,但没有说明上下文,因此我无法判断是我创建了一个bug,还是在不知不觉中利用了一个特性

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

我相信这是一个简单的修复方法,使用了一些基本的单元测试概念,我必须用艰苦的方式学习。提前谢谢


p.S.我意识到我在失败的规范中测试的不是我所描述的。我正在阅读API指南,寻找一种在函数调用中访问arguments数组的方法,以便对
参数[0]
进行特定测试。我们非常感谢您的提示,但不是必需的。我会弄明白的。

这是你监视窗口的原因。打电话后按一下按钮。我不完全确定spy是做什么的,但毕竟它用另一个函数替换了你所监视的函数,在这个函数中它可以检查函数被调用了,并且传递了什么参数。在开始测试之前创建按钮时,将调用原始的
窗口.Button
函数。然后用spy替换函数,并测试spy被调用的情况,因此测试必须失败


似乎要么在测试本身中创建按钮,要么在调用
beforeach
函数中的new按钮之前创建spy。

简短回答:否,beforeach和Spie不兼容

如果你想让间谍知道你的电话,你必须在打电话之前进行侦察。如果不希望干扰其默认行为,可以使用spyOn(对象,'function')。和callthrough()


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

切换顺序和callthrough()成功了+1并接受。多谢了。@parisminton。我发布了一个关于jamsine测试用例的问题。。如果你能帮忙,我会非常感激的。关于+1。事实上,我将
spyOn()
调用移到了
beforeach()
函数中,它完全按照您的建议工作。非常感谢。