首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么这个应许的AssertionError打印到控制台而不是我的摩卡测试跑步者?

为什么这个应许的AssertionError打印到控制台而不是我的摩卡测试跑步者?
EN

Stack Overflow用户
提问于 2015-10-09 14:08:40
回答 1查看 1.5K关注 0票数 3

我将对一些使用chai-as-promisedMocha承诺的代码进行测试。我的测试套件还利用取-模拟模拟通常使用Fetch API发送的AJAX请求。

下面是我要测试的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Sends a POST request to save (either insert or update) the record
 * @param  {object} record simple object of column name to column value mappings
 * @return {Promise}       Resolves when the POST request full response has arrived.
 * Rejects if the POST request's response contains an Authorization error.
 */
save(record) {
  var _this = this;
  return this._auth(record)
    .then(function() {
      return window.fetch(_this._getPostUrl(), {
        method: 'post',
        headers: {
          'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
        },
        body: _this._objToPostStr(record),
        credentials: 'include'
      });
    })
    .then(function(saveResp) {
      return saveResp.text();
    })
    .then(function(saveResp) {
      return new Promise(function(resolve, reject) {
        if (saveResp.indexOf('Authorization') !== -1) {
          reject('Request failed');
        } else {
          resolve(saveResp);
        }
      });
    });
}

在我最高级的describe中,我有一个函数,它最初设置我的fetchMock对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
before(() => {
  fetchMock = new FetchMock({
    theGlobal: window,
    Response: window.Response,
    Headers: window.Headers,
    Blob: window.Blob,
    debug: console.log
  });
  fetchMock.registerRoute({
    name: 'auth',
    matcher: /tlist_child_auth.html/,
    response: {
      body: 'authResp',
      opts: {
        status: 200
      }
    }
  });
});

下面是相关的测试代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
describe('save', () => {
  it('save promise should reject if response contains the string Authorization', () => {

    fetchMock.mock({
      routes: ['auth', {
        name: 'save',
        matcher: /changesrecorded.white.html/,
        response: {
          body: 'Authorization',
          opts: {
            status: 200
          }
        }
      }]
    });

    let _getLocationStub = sinon.stub(client, '_getLocation');
    _getLocationStub.returns('/admin/home.html');

    client.foreignKey = 12345;
    let promise = client.save({
      foo: 'bar'
    });
    promise.should.eventually.be.fulfilled;
    fetchMock.unregisterRoute('save');
  });
});

我在save调用中定义fetchMock.mock()路由的原因是,我还有另一个测试,需要重新定义save路由以返回其他内容。

为了确保所承诺的chai实际上是有效的,并将通知我失败的测试,我编写了一个失败的测试promise.should.eventually.be.fulfilled;。这将失败,因为如果响应包含Authorization,则由Authorization返回的承诺将被拒绝。Chrome控制台显示AssertionError和message: expected promise to be fulfilled but it was rejected with 'Request failed,但是我的Mocha test-runner.html页面显示这个测试通过了。出于某种原因,该承诺与摩卡的沟通不正常。

如果你想看我的整个项目,请看这个回购

知道为什么吗?

编辑:

下面是我的测试设置代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let expect = chai.expect;
mocha.setup('bdd');
chai.should();
chai.use(chaiAsPromised);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-12 08:52:22

promise.should.eventually.be.fulfilled值是一个承诺,您应该返回这个值,这样Mocha就可以知道测试结束时的情况。我创建了一个小测试文件来模拟您看到的内容,如果像您一样,我不能返回promise.should.eventually.be.fulfilled;,我就可以完全复制这个行为。下面是一个有用的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import chai from "chai";
import chaiAsPromised from "chai-as-promised";

chai.use(chaiAsPromised);
chai.should();

describe("foo", () => {
    it("bar", () => {
        let promise = Promise.reject(new Error());
        return promise.should.eventually.be.fulfilled;
    });
});

在您的代码中,您在测试的最后有一些清理代码:fetchMock.unregisterRoute('save');。根据您显示的内容,我会将其移到一个after钩子中,以便它能够反映您的before钩子。通常,after应该执行对应于beforeafterEach中的内容与beforeEach中的内容相对应的清理。但是,如果出于某种原因需要在测试中进行清理代码,可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        function cleanup() {
            console.log("cleanup");
        }

        return promise.should.eventually.be.fulfilled.then(
            // Called if there is no error, ie. if the promise was
            // fullfilled.
            cleanup,
            // Called if there is an error, ie. if the promise was
            // rejected.
            (err) => { cleanup(); if (err) throw err; });

不幸的是,柴似乎返回了一些看起来像ES6 Promise的东西,但只返回了部分内容。最终,它可能会返回一个实际的ES6承诺,然后无论发生什么情况,您都可以调用.finally来运行清理代码,并使错误自动传播。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33047851

复制
相关文章
一行命令搭建内部的管道
在上一篇《边缘计算k8s集群之SuperEdge》文章中,笔者基于ECK搭建了边缘集群并添加了节点。通过边缘集群,我们可以很方便的管理各个地域的节点,本地、各云厂商的机房、客户所在地、海外的都可以。在本篇内容,我们将讲述如何使用ipsec-vpn-server,通过一行命令即可搭建内部的管道,用于锻炼技术,技术学习。
心莱科技雪雁
2021/03/09
2.3K0
一行命令搭建内部的管道
在上一篇《边缘计算k8s集群之SuperEdge》博客中,笔者基于ECK搭建了边缘集群并添加了节点。通过边缘集群,我们可以很方便的管理各个地域的节点,本地、各云厂商的机房、客户所在地、海外的都可以。在本篇内容,我们将讲述如何使用ipsec-vpn-server,通过一行命令即可搭建内部的管道,用于锻炼技术,技术学习。
雪雁-心莱科技
2021/03/05
2.9K0
一行命令搭建内部的管道
函数内部的this指向
这些 this 的指向,是当我们调用函数的时候确定的。调用方式的不同决定了this 的指向不同
清出于兰
2020/10/26
1.7K0
函数内部的this指向
Java——内部类使用总结(基本概念、定义内部类、static定义内部类、方法中定义内部类)
类的组成包括:成员、方法,几乎所有程序都不会对嵌套程序有什么限定,内部类指的是在一个类中继续嵌套其他类结构的一种代码形式,且理论上可以一直嵌套。
Winter_world
2020/09/25
5530
Java——内部类使用总结(基本概念、定义内部类、static定义内部类、方法中定义内部类)
Angular 自定义管道
本文将使用 UltimateAngular/angular-pro-src 中的示例,来一步步介绍自定义管道的相关知识。在该示例中,我们将定义一个 FileSizePipe 管道,它用于实现对文件大小进行格式化显示。
阿宝哥
2019/11/05
1.5K0
体验usually.js的管道函数——pipe函数
usually.js 是一个面向现代 Web 开发的 JavaScript 函数库,基于 ES6 开发。最新版本2.4.1,最新版本usually.js增加管道函数—— pipe 函数。什么是管道函数?管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存。
用户6167509
2019/09/04
1K0
java内部类的作用(三)----定义使用回调函数的时候比较便捷---匿名内部类(anonymous)
匿名内部类(anonymous inner calss):将局部内部类的使用再深入一步。假如只创建这个类的一个对象,就不必命名了。这种类被称为匿名内部类。
wust小吴
2019/07/05
1.4K0
java内部类的作用(三)----定义使用回调函数的时候比较便捷---匿名内部类(anonymous)
内部函数与外部函数
函数是c语言程序中的最小单位,往往把一个函数或多个函数保存为一个文件,这个文件称为源文件。定义一个函数,这个函数就要被另外的函数所调用。但当一个源程序由多个源文件组成时,可以指定函数不能被其他文件调用,这样C语出又把函数分为两类:一个是内部函数,另一个是外部函数。
pigeon
2022/04/11
9820
Linux命名管道及函数
管道(pipe)应用的一大局限是没有名字,只能用于具有亲缘关系进程之间的通信。而命名管道,也称FIFO,实质是一种文件类型,通过FIFO可以用于任何两个进程间的通信。
xxpcb
2020/08/04
2.7K0
【Angular教程】自定义管道
这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战 一、管道的作用 方便我们在模板中对我们的数据进行格式化处理。 二、内置的常用管道 具体API参照官网查询使用 DatePipe: 格式化日期 UpperCasePipe: 文本转为全部大写 LowerCasePipe: 文本转为全部小写 TitleCasePipe: 文本转为标标题形式(如: hello world=>Hello World) KeyValuePipe: 将对象转为键值对形式 JsonPipe: 转为JSON字符串
前端小鑫同学
2022/12/25
1.3K0
【Angular教程】自定义管道
Clojure集合管道函数练习
TDD讨论组里的申导最近在B站直播了Martin Fowler的经典文章Refactoring with Loops and Collection Pipelines中谈到的利用集合管道对循环进行函数式重构。视频地址在这里,申导的翻译在这里。组织者小波(Seaborn Lee)趁机出了一道关于集合管道函数题目。我就想啊,论函数式编程,舍Clojure其谁?而且我在Clojure很少能写出loop... recur这样偏底层的循环代码。话不多说,撸起袖子开工。
lambeta
2018/08/17
1.1K0
【说站】java内部类的内存泄漏原因
2、如果内部类只是在外部类中引用,当外部类不再引用时,外部类和内部类可以通过GC回收。
很酷的站长
2022/11/23
5630
【说站】java内部类的内存泄漏原因
详解javascript中的即时函数,内部函数,能重写自身的函数即时函数内部函数返回函数的函数能重写自己的函数小结
在上篇谈到匿名函数和回调函数的基础上,我们接着介绍javascript中的即时函数,内部函数,返回函数的函数,能重写自身的函数等几种常见的函数类型及使用方法。只需要大致了解匿名函数的概念,应该就能看懂这些内容
desperate633
2018/08/22
1.6K0
7.6 内部函数和外部函数
2、对变量而言,声明与定义的关系稍微复杂一些。在声明部分出现的变量有两种情况:一种是需要建立存储空间的,另一种是不需要建立存储空间的。前者称为定义性声明,简称定义;后者称为引用性声明。
小林C语言
2019/07/12
1.1K0
6.8 内部函数和外部函数
解释:只能被本文件中其他函数所调用,在定义内部函数时,在函数名和函数类型的前面加static,所以内部函数又称静态函数
小林C语言
2019/08/19
7510
react 函数内部调用全局函数
错误信息 react TypeError: Cannot read property 'up' of undefined at 错误信息 react Unhandled Rejection (TypeError): Cannot read property 'setState' of undefined
wo.
2021/06/15
2.7K0
Ionic3 自定义管道
本文根据官网的例子简单介绍Angular管道的创建和使用,Angular官方文档 创建管道 创建一个管道可以直接使用ionic cli 工具 ionic g pipe sxypie 和创建 指令基本类似,导入导出也是一样的。 sxypie.ts 代码如下 import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'sxypie', pure: true, //true表示纯管道, false表示非纯管道 })
spilledyear
2018/08/21
4150
Ionic3 自定义管道
静态内部类和内部类的区别_内部类不能定义为抽象类
参考静态内部类和非静态内部类的区别中提到的 正常情况下,你不能在接口内部放置任何代码,但嵌套类可以作为接口的一部分,因为它是static 的。只是将嵌套类置于接口的命名空间内,这并不违反接口的规则,我试验了一下 ,无论是静态类还是非静态类都可以写在接口里。
全栈程序员站长
2022/11/10
3480
静态内部类和内部类的区别_内部类不能定义为抽象类
linux系统编程之管道(一):匿名管道和pipe函数
该文介绍了Linux环境下C++编写高性能可扩展的进程通信程序的设计和实现,主要包括管道、命名管道、信号、共享内存、消息队列、互斥量等进程间通信方式,以及通过Boost.Asio库实现的高性能TCP/UDP通信,并结合实际应用场景给出了性能测试和对比分析。
s1mba
2017/12/26
2.2K0
linux系统编程之管道(一):匿名管道和pipe函数
php面试笔记(5)-php基础知识-自定义函数及内部函数考点
在面试中,考官往往喜欢基础扎实的面试者,而函数相关的考点,往往是大家容易忽视的一个点,今天冷月就来帮各位小伙伴们梳理一下,在面试中函数相关的注意点。
学长冷月
2020/08/02
5260

相似问题

在管道函数内部检查值

11

管道擦伤原因

13

函数内部的函数定义

20

函数内部定义函数

20

管道破裂的原因

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文