为什么这个 chai-as-promised AssertionError 打印到控制台而不是我的 Mocha 测试运行程序?
Why is this chai-as-promised AssertionError printing to the Console but not my Mocha test runner?
我正在尝试测试一些使用 chai-as-promised
和 Mocha
的 Promises 的代码。我的测试套件还利用 fetch-mock 模拟通常使用 Fetch API 发送的 AJAX 请求。
这是我要测试的代码:
/**
* 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
对象。
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
}
}
});
});
这是相关的测试代码:
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');
});
});
我在 fetchMock.mock()
调用中定义 save
路由的原因是我有另一个测试需要将 save
路由重新定义为 return否则。
为了确保 chai-as-promised 确实有效并会通知我失败的测试,我写了一个失败的测试 promise.should.eventually.be.fulfilled;
。这将失败,因为如果响应包含 Authorization
,由 save
编辑的 Promise return 将拒绝,它会这样做。 Chrome 控制台显示带有 message: expected promise to be fulfilled but it was rejected with 'Request failed
的断言错误,但我的 Mocha test-runner.html
页面显示此测试已通过。出于某种原因,chai-as-promised 无法与 Mocha 正常通信。
如果您想查看我的整个项目,请参阅 Github 上的 this repo。
知道为什么吗?
编辑:
这是我的测试设置代码:
let expect = chai.expect;
mocha.setup('bdd');
chai.should();
chai.use(chaiAsPromised);
值 promise.should.eventually.be.fulfilled
是一个承诺,您应该 return 这样 Mocha 就可以知道您的测试何时结束。 我创建了一个一个小的测试文件来模拟你所看到的,我可以完全复制这个行为,如果我像你一样,只是失败了 return promise.should.eventually.be.fulfilled;
。这是一个有效的例子:
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
应该执行与 before
中的内容相对应的清理,afterEach
应该执行与 beforeEach
中的内容相对应的清理。但是,如果您出于某种原因需要在测试中使用清理代码,您可以这样做:
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; });
不幸的是,Chai 似乎 return 看起来像 ES6 Promise
的东西,但只是部分。最终,它可能 return 一个实际的 ES6 promise,然后无论发生什么,你都可以调用 .finally
到 运行 清理代码,并让错误自动向上传播。
我正在尝试测试一些使用 chai-as-promised
和 Mocha
的 Promises 的代码。我的测试套件还利用 fetch-mock 模拟通常使用 Fetch API 发送的 AJAX 请求。
这是我要测试的代码:
/**
* 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
对象。
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
}
}
});
});
这是相关的测试代码:
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');
});
});
我在 fetchMock.mock()
调用中定义 save
路由的原因是我有另一个测试需要将 save
路由重新定义为 return否则。
为了确保 chai-as-promised 确实有效并会通知我失败的测试,我写了一个失败的测试 promise.should.eventually.be.fulfilled;
。这将失败,因为如果响应包含 Authorization
,由 save
编辑的 Promise return 将拒绝,它会这样做。 Chrome 控制台显示带有 message: expected promise to be fulfilled but it was rejected with 'Request failed
的断言错误,但我的 Mocha test-runner.html
页面显示此测试已通过。出于某种原因,chai-as-promised 无法与 Mocha 正常通信。
如果您想查看我的整个项目,请参阅 Github 上的 this repo。
知道为什么吗?
编辑:
这是我的测试设置代码:
let expect = chai.expect;
mocha.setup('bdd');
chai.should();
chai.use(chaiAsPromised);
值 promise.should.eventually.be.fulfilled
是一个承诺,您应该 return 这样 Mocha 就可以知道您的测试何时结束。 我创建了一个一个小的测试文件来模拟你所看到的,我可以完全复制这个行为,如果我像你一样,只是失败了 return promise.should.eventually.be.fulfilled;
。这是一个有效的例子:
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
应该执行与 before
中的内容相对应的清理,afterEach
应该执行与 beforeEach
中的内容相对应的清理。但是,如果您出于某种原因需要在测试中使用清理代码,您可以这样做:
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; });
不幸的是,Chai 似乎 return 看起来像 ES6 Promise
的东西,但只是部分。最终,它可能 return 一个实际的 ES6 promise,然后无论发生什么,你都可以调用 .finally
到 运行 清理代码,并让错误自动向上传播。