node.js - Mocha 测试在本地主机上传递,但在 TravisCI 上运行时不传递

标签 node.js mocha.js 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 上运行时,即使在测试中,响应变量也会被报告为未定义。这对我来说意味着存在某种异步混合,但是在 before() 上使用 done() 回调应该可以缓解这种情况,不是吗?我什至尝试将 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.

最佳答案

不知怎的,我不完全确定这个语法使用任何版本的 都可以正常工作。我已经本地安装了。部署到 TravisCI 时,它必须安装了较新的版本,这会导致任何类型检查断言失败。

以前的工作原理(根据 this ):

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

实际上需要用括号调用:

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

...如 official docs 中所示.

关于node.js - Mocha 测试在本地主机上传递,但在 TravisCI 上运行时不传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33986942/

相关文章:

.net - 从第 3 方源恢复 NuGet 包

node.js - 不同的 Mocha 行为 - 异步/同步 promise

javascript - 使用 Mocha 测试样式集

Travis CI 中的 Docker 构建失败 - 模式中出现 "Error checking context: ' 语法错误”

node.js - 根据控制台输入定位某些环境

javascript - 如果失败,则跳过规范中的后续 Mocha 测试

android - Travis-CI 构建失败, "You have not accepted the license agreements"

node.js - 未收到数据时将 'silent frames' 添加到 Node.js 流

node.js - 使用EJS时如何解决 "Unresolved variable or type data"警告?

javascript - 有没有办法在express.js中的url路由中执行动态键/值参数