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

Jasmine fails when same test is run twice

本文关键字:两次 失败 测试运行 Jasmine      更新时间:2023-09-26

我遇到这样的情况,代码正在工作,但当我运行同一个测试两次时,它失败了,我不知道为什么。在beforeEach()中似乎有一个我不知道的gotcha;

之前两个,每个都运行。一个在顶部的第一个"描述"中,另一个在前面的"描述"内。

有人知道这里出了什么问题吗?

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

这是来自beforeEach块的一行:

container = $('<div id="container" />');

创建一个divid等于"container"。现在问题就在这里:

$('body').append(container).append(sourceElement).append(destinationElement);
container = $('#container');

第一次测试后,一切都很好,因为身体里只有一个"容器"。但是,当您运行第二个测试,并因此再次运行beforeEach块时,另一个"容器"被附加到主体。现在有两个div元素带有id"容器",查询选择器的行为是未定义的。

一个好的解决方案是添加一个afterEach块,在测试后在其中进行清理——在本例中是删除容器。

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