我写了一个像这样的测试套件:
this.slow(1000)
this.timeout(6000)
var response, client
before(function(done) {
client = new UsergridClient()
client.GET(_collection, function(err, r) {
response = r
done()
})
})
it('should not fail when a callback function is not passed', function() {
// note: this test will NOT fail gracefully inside the Mocha event chain
client.GET(_collection)
})
it('should return a 200 ok', function() {
// ******** LOGGING ********* //
console.log(response)
// ******** LOGGING ********* //
response.statusCode.should.equal(200)
})
it('response.entities should be an array', function() {
response.entities.should.be.an.Array
})
it('response.first should exist and have a valid uuid', function() {
response.first.should.be.an.Object.with.property('uuid').with.a.lengthOf(36)
})
it('response.entity should exist and have a valid uuid', function() {
response.entity.should.be.an.Object.with.property('uuid').with.a.lengthOf(36)
})
it('response.last should exist and have a valid uuid', function() {
response.last.should.be.an.Object.with.property('uuid').with.a.lengthOf(36)
})
在本地运行此测试时,所有测试都通过。但是,当在TravisCI上运行时,即使在测试中,response
变量也会报告为undefined
。这告诉我有某种异步混合,但在done()
上使用before()
回调可以减轻这种情况,不应该吗?我甚至尝试在每次后续测试中添加done
回调,但这仍然无效。
这里值得注意的错误是:
TypeError: Cannot read property 'property' of undefined
它看起来像是被抛出:
response.first.should.be.an.Object.with.property('uuid').with.a.lengthOf(36)
让我觉得Travis的环境不喜欢Object.with
或者甚至只是.with
?
这是我的.travis.yml文件:
language: node_js
node_js:
- '5.1.0'
install:
- 'npm install'
- 'npm -g install mocha'
script:
- 'mocha tests'
这是运行日志:
Using worker: worker-linux-docker-7421b08d.prod.travis-ci.org:travis-linux-8
system_info
Build system information
Build language: node_js
Build group: stable
Build dist: precise
Build image provisioning date and time
Thu Feb 5 15:09:33 UTC 2015
Operating System Details
Distributor ID: Ubuntu
Description: Ubuntu 12.04.5 LTS
Release: 12.04
Codename: precise
Linux Version
3.13.0-29-generic
Cookbooks Version
a68419e https://github.com/travis-ci/travis-cookbooks/tree/a68419e
GCC version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
clang version 3.4 (tags/RELEASE_34/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
Pre-installed Ruby versions
ruby-1.9.3-p551
Pre-installed Node.js versions
v0.10.36
Pre-installed Go versions
1.4.1
Redis version
redis-server 2.8.19
riak version
2.0.2
MongoDB version
MongoDB 2.4.12
CouchDB version
couchdb 1.6.1
Neo4j version
1.9.4
RabbitMQ Version
3.4.3
ElasticSearch version
1.4.0
Installed Sphinx versions
2.0.10
2.1.9
2.2.6
Default Sphinx version
2.2.6
Installed Firefox version
firefox 31.0esr
PhantomJS version
1.9.8
ant -version
Apache Ant(TM) version 1.8.2 compiled on December 3 2011
mvn -version
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-14T17:29:23+00:00)
Maven home: /usr/local/maven
Java version: 1.7.0_76, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-7-oracle/jre
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "3.13.0-29-generic", arch: "amd64", family: "unix"
git.checkout
0.36s$ git clone... cloning
remote: Counting objects: 315, done.
remote: Compressing objects: 100% (153/153), done.
remote: Total 315 (delta 74), reused 0 (delta 0), pack-reused 161
Receiving objects: 100% (315/315), 48.32 KiB | 0 bytes/s, done.
Resolving deltas: 100% (156/156), done.
Checking connectivity... done.
$ cd path/to/proj
$ git checkout -qf <hash>
This job is running on container-based infrastructure, which does not allow use of 'sudo', setuid and setguid executables.
If you require sudo, add 'sudo: required' to your .travis.yml
See http://docs.travis-ci.com/user/workers/container-based-infrastructure/ for details.
3.13s$ nvm install 5.1.0
######################################################################## 100.0%
Checksums empty
Now using node v5.1.0
$ node --version
v5.1.0
$ npm --version
3.3.12
$ nvm --version
0.23.3
install.1
17.95s$ npm install
npm WARN engine underscore.inflection@1.3.0: wanted: {"node":">=0.10.0 <0.12"} (current: {"node":"5.1.0","npm":"3.3.12"})
npm WARN deprecated lodash@0.9.2: lodash@<3.0.0 is no longer maintained. Upgrade to lodash@^3.0.0.
npm WARN deprecated lodash@2.4.2: lodash@<3.0.0 is no longer maintained. Upgrade to lodash@^3.0.0.
app@2.0.0 /home/travis/build/path/to/app
... list of packages
npm WARN EPACKAGEJSON app@2.0.0 No repository field.
install.2
1.71s$ npm -g install mocha
/home/travis/.nvm/versions/node/v5.1.0/bin/mocha -> /home/travis/.nvm/versions/node/v5.1.0/lib/node_modules/mocha/bin/mocha
/home/travis/.nvm/versions/node/v5.1.0/bin/_mocha -> /home/travis/.nvm/versions/node/v5.1.0/lib/node_modules/mocha/bin/_mocha
/home/travis/.nvm/versions/node/v5.1.0/lib
... list of packages
1.50s$ mocha tests
init() / initSharedInstance()
✓ should be an instance of Client
Client
initialization
✓ should fail to initialize without an orgId and appId
✓ should initialize using properties defined in config.json
✓ should initialize when passing orgId and appId as arguments, taking precedence over config
✓ should initialize when passing an object containing orgId and appId, taking precedence over config
GET()
IncomingMessage {
_readableState:
... omitted
readable: false,
domain: null,
headers:
... omitted
client:
... omitted
req:
... omitted
request:
... omitted
toJSON: [Function: responseToJSON],
caseless:
Caseless {
dict:
{ 'access-control-allow-origin': '*',
'content-type': 'application/json',
date: 'Sun, 29 Nov 2015 22:44:54 GMT',
server: 'Apache-Coyote/1.1',
'set-cookie': [Object],
'transfer-encoding': 'chunked',
connection: 'Close' } },
read: [Function],
body:
{ action: 'get',
application: '19748000-24b6-11e3-9877-6d1a3f81ba2f',
params: {},
path: '/tests',
uri: 'https://api.mydomain.com/myorg/sandbox/tests',
entities:
[ [Object],
[Object],
[Object],
[Object],
[Object],
[Object],
[Object] ],
timestamp: 1448837094623,
duration: 65,
organization: 'myorg',
applicationName: 'sandbox',
cursor: 'LTU2ODc0MzQzOkdCcGJDbVpTRWVXVndibnE5RUdORGc',
count: 7 },
entities:
[ ],
first:
{ uuid: 'b3037a1a-4cd6-11e5-8aa2-0b8eb3ce43ee',
type: 'test',
name: '01',
created: 1440692071473,
modified: 1440692071473,
food: 'pizza',
metadata: { path: '/tests/b3037a1a-4cd6-11e5-8aa2-0b8eb3ce43ee' },
value: 1 },
entity:
{ uuid: 'b3037a1a-4cd6-11e5-8aa2-0b8eb3ce43ee',
type: 'test',
name: '01',
created: 1440692071473,
modified: 1440692071473,
food: 'pizza',
metadata: { path: '/tests/b3037a1a-4cd6-11e5-8aa2-0b8eb3ce43ee' },
value: 1 },
last:
{ uuid: '181a5b0a-6652-11e5-95c1-b9eaf4418d0e',
type: 'test',
created: 1443493848240,
modified: 1443493848240,
metadata: { path: '/tests/181a5b0a-6652-11e5-95c1-b9eaf4418d0e' },
title: 'Charlotte\'s Web' } }
✓ should not fail when a callback function is not passed
✓ should return a 200 ok
✓ response.entities should be an array
1) response.first should exist and have a valid uuid
2) response.entity should exist and have a valid uuid
3) response.last should exist and have a valid uuid
POST()
✓ should not fail when a callback function is not passed
✓ should return a 200 ok
4) response.entities should be an array
5) response.entity should exist and have a valid uuid
✓ response.entity.author should equal "Sir Arthur Conan Doyle"
PUT()
✓ should not fail when a callback function is not passed
✓ should return a 200 ok
6) response.entities should be an array
7) response.entity should exist and its uuid should the uuid from the previous POST requets
✓ response.entity.narrator should equal "Peter Doyle"
DELETE()
✓ should not fail when a callback function is not passed
✓ should return a 200 ok
✓ response.error.name should equal "service_resource_not_found"
authenticateApp()
✓ should return a 200 ok
✓ should have a valid token
✓ client.appAuth.token should be set to the token returned from
✓ client.appAuth.expiry should be set to a future date
appAuth / setAppAuth()
✓ should initialize by passing a list of arguments
✓ should initialize by passing an object
✓ should initialize by passing an instance of AppAuth
✓ should initialize by setting to an instance of AppAuth
Query
_type
✓ query._type should equal "cats" when passing "type" as a parameter to Query
✓ query._type should equal "cats" when calling .type() builder method
✓ query._type should equal "cats" when calling .collection() builder method
_limit
✓ query._limit should equal 10
_ql
✓ should support complex builder syntax (chained constructor methods)
✓ not operator should precede conditional statement
✓ string values should be contained in single quotes
✓ boolean values should not be contained in single quotes
✓ float values should not be contained in single quotes
✓ integer values should not be contained in single quotes
✓ uuid values should not be contained in single quotes
36 passing (696ms)
7 failing
1) Client GET() response.first should exist and have a valid uuid:
TypeError: Cannot read property 'property' of undefined
at Context.<anonymous> (tests/lib/client.test.js:69:48)
2) Client GET() response.entity should exist and have a valid uuid:
TypeError: Cannot read property 'property' of undefined
at Context.<anonymous> (tests/lib/client.test.js:73:49)
3) Client GET() response.last should exist and have a valid uuid:
TypeError: Cannot read property 'property' of undefined
at Context.<anonymous> (tests/lib/client.test.js:77:47)
4) Client POST() response.entities should be an array:
TypeError: Cannot read property 'a' of undefined
at Context.<anonymous> (tests/lib/client.test.js:108:50)
5) Client POST() response.entity should exist and have a valid uuid:
TypeError: Cannot read property 'property' of undefined
at Context.<anonymous> (tests/lib/client.test.js:112:49)
6) Client PUT() response.entities should be an array:
TypeError: Cannot read property 'a' of undefined
at Context.<anonymous> (tests/lib/client.test.js:146:50)
7) Client PUT() response.entity should exist and its uuid should the uuid from the previous POST requets:
TypeError: Cannot read property 'property' of undefined
at Context.<anonymous> (tests/lib/client.test.js:150:49)
The command "mocha tests" exited with 7.
Done. Your build exited with 1.
答案 0 :(得分:0)
不知何故,我并不完全确定如何使用本地安装的this版本的语法正常工作。部署到TravisCI时,它必须安装更新版本,导致任何类型检查断言失败。
之前有效(根据official docs):
pairhash
实际上需要用括号调用:
response.first.should.be.an.Object.with.property('uuid').with.a.lengthOf(36)