Mocha测试传递localhost,但在TravisCI上运行时没有

时间:2015-11-29 19:19:35

标签: node.js mocha travis-ci

我写了一个像这样的测试套件:

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.

1 个答案:

答案 0 :(得分:0)

不知何故,我并不完全确定如何使用本地安装的this版本的语法正常工作。部署到TravisCI时,它必须安装更新版本,导致任何类型检查断言失败。

之前有效(根据official docs):

pairhash

实际上需要用括号调用:

response.first.should.be.an.Object.with.property('uuid').with.a.lengthOf(36)

...如enter image description here所示。