Javascript Jasmine在同一测试运行两次时失败

Javascript Jasmine在同一测试运行两次时失败,javascript,jasmine,Javascript,Jasmine,在这种情况下,代码可以工作,但是当我运行同一个测试两次时,它失败了,我不知道为什么。看起来在beforeach()中有一个我不知道的问题 在每次运行之前有两个。第一个在顶部的“描述”中,第二个在前面的“描述”中 有人知道这里有什么问题吗 describe("[data-add-selected].click()", function () { var option; beforeEach(function () { initialize(); option = cont

在这种情况下,代码可以工作,但是当我运行同一个测试两次时,它失败了,我不知道为什么。看起来在beforeach()中有一个我不知道的问题

在每次运行之前有两个。第一个在顶部的“描述”中,第二个在前面的“描述”中

有人知道这里有什么问题吗

describe("[data-add-selected].click()", function () {
  var option;

  beforeEach(function () {
    initialize();
    option = container.find('.source .option:last');
    option.addClass('selected');
    container.find('[data-add-selected]').click();
  });

  it("this succeeds", function () {
    expect(source.getOptions().length).toEqual(1);
    expect(destination.getOptions().length).toEqual(2);
  });

  it("this FAILS", function () {
    expect(container.find('.source .option').length).toEqual(1);
    expect(container.find('.destination .option').length).toEqual(2);
  });
});
正在进行的工作(在浏览器上工作,但在测试中失败)

TIA。

根据您提供的信息以及您在以各种方式操作测试时对测试行为的评论,问题的最可能原因是您使用了相同的
id
两次

下面是每个块之前的
行:

container = $('<div id="container" />');
第一次测试后,一切正常,因为体内只有一个“容器”。但是,当您运行第二个测试时,以及随后再次运行每个
块之前的
,另一个“容器”将附加到主体中。现在有2个
div
元素具有
id
“container”,并且查询选择器的行为未定义

一个好的解决方案是在每个
块之后添加一个
,在测试之后在其中执行清理——在本例中是移除容器

afterEach(function () {
    $('#container').remove();
});

您是否要为每个测试重置dom?它看起来像是在与dom交互,并且
option.addClass('selected')实际上改变了DOM状态。您是否在测试之间重置DOM状态?这就是
initialize()
所做的吗?如何重置DOM@DanielA.White?@AlexWayne我更新了问题并将github链接粘贴到我的代码中。谢谢你的回答@STT。是的,我想可能是这样。但实际上它失败了,因为它不是4,而是只有一个。这里是简化的要点:我明白了,我没有在
descripe
块中看到每个
之前的第二个
。我现在想,这可能与
onclick
侦听器有关。也许在您的decorator中,选项在逻辑上是移动的,但在DOM中,它们保持在同一个位置?似乎不是@STT的情况。如果我注释掉第90行和第92行(因此将所有断言分组在一个“it”中),它就可以工作了。因此,听者正在工作。此外,它还可用于手动浏览器测试=/我有另一个想法——在第63行中,您添加了一个
div
id
“container”。请注意,这样做两次(在每次测试之前)——可能会混淆查询选择器(两个具有相同ID的元素)。尝试在从
主体中移除容器的每个
块后添加一个
。你成功了!gist中的测试在I
$(“#容器”)之后通过。remove()
!非常感谢。你能给我一个答案让我选一个正确的吗?非常感谢你!
afterEach(function () {
    $('#container').remove();
});