当前位置: 首页 > 知识库问答 >
问题:

在 Jasmine 测试失败后执行代码

和弘博
2023-03-14

只有当Jasmine测试失败时才可能做某事吗?与在it()之后执行的 之后并置,无论结果如何,我正在寻找一种仅在 it()有一个失败的期望之后执行代码的方法。

这个问题不是特定于Angular的,但在我的场景中,我正在测试一个Angular服务,它使用<code>和$log<code>输出调试消息。我不想为了成功的测试而使控制台杂乱无章,只想显示失败测试的附加信息。

describe("MyService", function() {
    var MyService, $log;

    beforeEach(function() {
        inject(function (_MyService_, _$log_) {
            MyService = _MyService_;
            $log = _$log_;
        });
    });

    afterEach(function () {
        if (/* test failed */) {
            //console.log($log.debug.logs);
        }
    });

    it("should output debug logs when this fails", function() {
        //do something with MyService that would put a message in $log
        expect(false).toBe(true);
    });
});

我正在运行Jasmine 2.2.0。

编辑:这是一个非常简单的小提琴,显示Jasmine 1.3 jasmine.getEnv().currentSpec解决方案不再有效。

共有3个答案

姜钧
2023-03-14

我仍然在使用Jasmine 1.2,所以Jasmine 2.0中的情况可能会有所不同。

在您的post在每个函数中,您应该能够通过使用以下方式访问刚刚完成的当前规范:

var currentSpec = jasmine.getEnv().currentSpec;

这将返回一个具有许多属性的对象。其中之一是通过了多少嵌入式测试(results_.passedCount)。

您可以针对该值进行测试,并适当地执行日志记录。

祝你好运!

白信鸿
2023-03-14

我终于找到了如何在Jasmine 2.3.4中获取失败规范结果的引用,但我不确定它是否正是您想要的。

我使用Jasmine安装程序附带的vanillaPlayerSpec.js文件。我运行SpecRunner.html文件来执行测试。

以下是我在PlayerSpec文件中所做的更改:

describe("Player", function() {
  var player;
  var song;
  var index = 0;

  beforeEach(function() {
    player = new Player();
    song = new Song();
    this.index = index++;
  });

  afterEach(function() {
    if (this.index > 0)
    {   var failed = jsApiReporter.specResults(this.index -1, 1)[0].failedExpectations;
        console.log('failed: ', failed);
        if (failed.length > 0)
        {
            console.log('After: ', this, failed[0].message);
            alert('ha');
        }
    }
  });
  it("should not fail", function()
  { expect(1).toEqual(2);
  });
...

文件的其余部分与原始状态相同。

这里是我改变的:

添加了一个索引变量来跟踪当前的等级库编号。

在beforeach函数中,我将索引值添加到“this”对象中,该对象在it、beforeaeach和afterEach函数之间传递。这允许我在必要时在他们之间进行沟通。我只使用这个机制来传递索引。当心如果您只是尝试使用索引值,它将不起作用!函数是异步处理的,因此索引值很有可能不是您在afterEach函数中期望的值。

在后每个函数中,我检查以确保索引大于0。在我的本地测试中,第一个规范失败,但直到第二次调用后每个才被识别出来。这是我不确定这是否能像您想要的那样工作的原因之一。然后我获取对失败期望的引用,如果我识别出错误,我会进行一些条件处理。

存在的最后一个更改是添加了一个新的规范,该规范将生成故障。

这是我的FireBug控制台结果的一个糟糕副本:

failed: [Object { matcherName="toEqual",  message="Expected 1 to equal 2.",  stack="stack@http://localhost:4...ne-2.3.4/boot.js:110:5\n",  more...}]
PlayerSpec.js (line 15)
After: Object { index=1} Expected 1 to equal 2.
PlayerSpec.js (line 18)
failed: []
PlayerSpec.js (line 15)
failed: []
PlayerSpec.js (line 15)
failed: []
PlayerSpec.js (line 15)
failed: []
PlayerSpec.js (line 15)

这个问题对我来说是一个旅程。遗憾的是,我必须转向其他事情。

我真诚地希望这能解决你的问题,或者至少为你指明正确的方向。希望它也能帮助其他人。

祝你好运

翟学文
2023-03-14

这是在 Jasmine 2 中重新启用 jasmine.getEnv().currentSpec 的技巧(某种程度上,结果不是完整的 spec 对象,而是包含 iddescriptionfullNamefailedExpectationspassedExpectations):

jasmine.getEnv().addReporter({
    specStarted(result) {
        jasmine.getEnv().currentSpec = result;
    },
    specDone() {
        jasmine.getEnv().currentSpec = null;
    }
});
 类似资料:
  • 我按照cypress在他们的文档中推荐的方式编写测试,即每个测试有多个断言,但是用这种方式编写测试时会出现一个问题,那就是如果断言失败,测试执行就会停止。 我希望每个测试有多个断言,如果其中一个失败,测试将失败,但将继续测试执行,所以在最后,我将能够看到测试中失败的所有断言,而不仅仅是第一个失败的断言。 提前感谢!

  • 我试图用jenkins execution命令测试我的java项目,但是我得到了以下错误消息: 有关单个测试结果,请参阅/var/jenkins_home/workspace/test1/target/surefire-reports。请参阅转储文件(如果存在)[date].dump,[date]-jvmrun[N].dump和[date].dumpstream。分叉的VM在没有正确地说再见的情况

  • 问题内容: 我在python的unittest2框架中运行了一些基于类的单元测试。我们正在使用Selenium WebDriver,它具有便捷的方法。我想在每次测试失败时在tearDown()中抓取一个屏幕截图,以减少调试_为什么_ 测试失败的时间。 但是,我找不到仅在测试失败时运行代码的任何方法。不管测试是否成功,都会调用,并且我不想用成百上千的浏览器屏幕快照来使我们的文件系统混乱,以确保测试成

  • 在使用maven运行单元测试时,我遇到了这个异常。我的所有测试都没有执行。我的测试类的格式是 我正在运行以下命令来运行此命令: 使用的surefire插件是: 有人知道为什么我的测试没有执行吗?我用的是jUnit 4.8.2和surefire 2.14.1

  • 无法执行目标org.apache.maven.plugins:maven-compiler-plugin:3.1:在项目gameoflife上编译(default-compile)-core:编译失败[错误]此环境中未提供编译器。也许您运行的是JRE而不是JDK? 我已经在我的机器上安装了Java,但仍然面临这个问题。 我在做EC2。

  • 我正在尝试测试我的角度4.1.0组件- 然而,一个简单的“应该创建”测试抛出了这个神秘的错误... NetworkError:未能对“XMLHttpRequest”执行“send”:未能加载“ng:///DynamicTestModule/module.ngfactory.js”。 所以我发现了这个问题,这表明问题是组件有 参数未设置,但是,如果我像这样修改我的测试: 同样,如果我从组件中移除<