系统相关
首页 > 系统相关> > node.js – Karma PhantomJs – Linux和Win 7上的TypeError所有测试都成功

node.js – Karma PhantomJs – Linux和Win 7上的TypeError所有测试都成功

作者:互联网

我正在运行命令

npm install karma karma-jasmine karma-phantomjs-launcher phantomjs@2.1.7 jasmine-core --save-dev
karma start

在我的Linux CentOs 7.2机器上并收到此错误:

bower_components/angular/angular.js:4641:53
        forEach@bower_components/angular/angular.js:321:24
        loadModules@bower_components/angular/angular.js:4601:12
        createInjector@bower_components/angular/angular.js:4523:30
        workFn@vendor/angular-mocks.js:2427:60
        TypeError: undefined is not an object (evaluating '$rootScope.$new') in my-components/my-specific-component/spec/mySpecificController.spec.js (line 84)
        createController@my-components/my-specific-component/spec/mySpecificController.spec.js:84:37
        my-components/my-specific-component/spec/mySpecificController.spec.js:92:42
(...10 more tests failing in the same spec...)
PhantomJS 2.1.1 (Linux 0.0.0): Executed 54 of 54 (11 FAILED) (0.349 secs / 1.251 secs)

我在Windows 7机器上运行完全相同的命令,所有测试都成功完成:

PhantomJS 2.1.1 (Windows 7 0.0.0): Executed 54 of 54 SUCCESS (0.152 secs / 1.102 secs)

我检查了安装的npm的版本:

赢7 —> npm 2.15.1
CentOs 7.2 —> npm 3.10.3
评论:不应该是一个showstopper,不应该吗?

Win 7上的npm安装模块:

myuser@mycomputer MINGW64 /c/Users/myuser/IdeaProjects/my_project/src/main/webapp (feature/some-feature)
$npm ls --global
C:\Users\myuser\AppData\Roaming\npm
├── bower@1.7.9
└─┬ karma-cli@1.0.1
  └── resolve@1.1.7

CentOs7中安装的npm模块:

[root@localhost webapp]# npm ls --global
/usr/lib
├── ansi@0.2.1
├── bower@1.7.9
├─┬ karma-cli@1.0.1
│ └── resolve@1.1.7
├─┬ npm@3.10.3
│ ├── abbrev@1.0.9 -> /usr/lib/node_modules/npm/node_modules.bundled/abbrev
│ ├── ansi-regex@2.0.0 -> /usr/lib/node_modules/npm/node_modules.bundled/ansi-regex
│ ├── ansicolors@0.3.2 -> /usr/lib/node_modules/npm/node_modules.bundled/ansicolors
│ ├── ansistyles@0.1.3 -> /usr/lib/node_modules/npm/node_modules.bundled/ansistyles
│ ├── aproba@1.0.4 -> /usr/lib/node_modules/npm/node_modules.bundled/aproba
│ ├── archy@1.0.0 -> /usr/lib/node_modules/npm/node_modules.bundled/archy
│ ├── asap@2.0.4 -> /usr/lib/node_modules/npm/node_modules.bundled/asap
│ ├── chownr@1.0.1 -> /usr/lib/node_modules/npm/node_modules.bundled/chownr
│ ├── cmd-shim@2.0.2 -> /usr/lib/node_modules/npm/node_modules.bundled/cmd-shim
│ ├─┬ columnify@1.5.4 -> /usr/lib/node_modules/npm/node_modules.bundled/columnify
│ │ └─┬ wcwidth@1.0.0
│ │   └─┬ defaults@1.0.3
│ │     └── clone@1.0.2
│ ├─┬ config-chain@1.1.10 -> /usr/lib/node_modules/npm/node_modules.bundled/config-chain
│ │ └── proto-list@1.2.4
│ ├── debuglog@1.0.1 -> /usr/lib/node_modules/npm/node_modules.bundled/debuglog
│ ├── dezalgo@1.0.3 -> /usr/lib/node_modules/npm/node_modules.bundled/dezalgo
│ ├── editor@1.0.0 -> /usr/lib/node_modules/npm/node_modules.bundled/editor
│ ├── fs-vacuum@1.2.9 -> /usr/lib/node_modules/npm/node_modules.bundled/fs-vacuum
│ ├── fs-write-stream-atomic@1.0.8 -> /usr/lib/node_modules/npm/node_modules.bundled/fs-write-stream-atomic
│ ├── fstream@1.0.10 -> /usr/lib/node_modules/npm/node_modules.bundled/fstream
│ ├─┬ fstream-npm@1.1.0 -> /usr/lib/node_modules/npm/node_modules.bundled/fstream-npm
│ │ └─┬ fstream-ignore@1.0.5
│ │   └─┬ minimatch@3.0.0
│ │     └─┬ brace-expansion@1.1.4
│ │       ├── balanced-match@0.4.1
│ │       └── concat-map@0.0.1
│ ├─┬ glob@7.0.4 -> /usr/lib/node_modules/npm/node_modules.bundled/glob
│ │ ├── fs.realpath@1.0.0
│ │ ├─┬ minimatch@3.0.0
│ │ │ └─┬ brace-expansion@1.1.5
│ │ │   ├── balanced-match@0.4.1
│ │ │   └── concat-map@0.0.1
│ │ └── path-is-absolute@1.0.0
│ ├── graceful-fs@4.1.4 -> /usr/lib/node_modules/npm/node_modules.bundled/graceful-fs
│ ├── has-unicode@2.0.1 -> /usr/lib/node_modules/npm/node_modules.bundled/has-unicode
│ ├── hosted-git-info@2.1.5 -> /usr/lib/node_modules/npm/node_modules.bundled/hosted-git-info
│ ├── iferr@0.1.5 -> /usr/lib/node_modules/npm/node_modules.bundled/iferr
│ ├── imurmurhash@0.1.4 -> /usr/lib/node_modules/npm/node_modules.bundled/imurmurhash
│ ├── inflight@1.0.5 -> /usr/lib/node_modules/npm/node_modules.bundled/inflight
│ ├── inherits@2.0.1 -> /usr/lib/node_modules/npm/node_modules.bundled/inherits
│ ├── ini@1.3.4 -> /usr/lib/node_modules/npm/node_modules.bundled/ini
│ ├─┬ init-package-json@1.9.4 -> /usr/lib/node_modules/npm/node_modules.bundled/init-package-json
│ │ ├─┬ glob@6.0.4
│ │ │ ├─┬ minimatch@3.0.0
│ │ │ │ └─┬ brace-expansion@1.1.4
│ │ │ │   ├── balanced-match@0.4.1
│ │ │ │   └── concat-map@0.0.1
│ │ │ └── path-is-absolute@1.0.0
│ │ └── promzard@0.3.0
│ ├── lockfile@1.0.1 -> /usr/lib/node_modules/npm/node_modules.bundled/lockfile
│ ├── lodash._baseindexof@3.1.0 -> /usr/lib/node_modules/npm/node_modules.bundled/lodash._baseindexof
│ ├─┬ lodash._baseuniq@4.6.0 -> /usr/lib/node_modules/npm/node_modules.bundled/lodash._baseuniq
│ │ ├── lodash._createset@4.0.3
│ │ └── lodash._root@3.0.1
│ ├── lodash._bindcallback@3.0.1 -> /usr/lib/node_modules/npm/node_modules.bundled/lodash._bindcallback
│ ├── lodash._cacheindexof@3.0.2 -> /usr/lib/node_modules/npm/node_modules.bundled/lodash._cacheindexof
│ ├── lodash._createcache@3.1.2 -> /usr/lib/node_modules/npm/node_modules.bundled/lodash._createcache
│ ├── lodash._getnative@3.9.1 -> /usr/lib/node_modules/npm/node_modules.bundled/lodash._getnative
│ ├─┬ lodash.clonedeep@4.3.2 -> /usr/lib/node_modules/npm/node_modules.bundled/lodash.clonedeep
│ │ └── lodash._baseclone@4.5.3
│ ├── lodash.restparam@3.6.1 -> /usr/lib/node_modules/npm/node_modules.bundled/lodash.restparam
│ ├─┬ lodash.union@4.4.0 -> /usr/lib/node_modules/npm/node_modules.bundled/lodash.union
│ │ ├── lodash._baseflatten@4.2.1
│ │ └── lodash.rest@4.0.3
│ ├── lodash.uniq@4.3.0 -> /usr/lib/node_modules/npm/node_modules.bundled/lodash.uniq
│ ├─┬ lodash.without@4.2.0 -> /usr/lib/node_modules/npm/node_modules.bundled/lodash.without
│ │ ├─┬ lodash._basedifference@4.5.0
│ │ │ └── lodash._root@3.0.1
│ │ └── lodash.rest@4.0.3
│ ├─┬ mkdirp@0.5.1 -> /usr/lib/node_modules/npm/node_modules.bundled/mkdirp
│ │ └── minimist@0.0.8
│ ├─┬ node-gyp@3.3.1 -> /usr/lib/node_modules/npm/node_modules.bundled/node-gyp
│ │ ├─┬ glob@4.5.3
│ │ │ └─┬ minimatch@2.0.10
│ │ │   └─┬ brace-expansion@1.1.3
│ │ │     ├── balanced-match@0.3.0
│ │ │     └── concat-map@0.0.1
│ │ ├─┬ minimatch@1.0.0
│ │ │ ├── lru-cache@2.7.3
│ │ │ └── sigmund@1.0.1
│ │ ├─┬ npmlog@2.0.4
│ │ │ ├── ansi@0.3.1
│ │ │ ├─┬ are-we-there-yet@1.1.2
│ │ │ │ └── delegates@1.0.0
│ │ │ └─┬ gauge@1.2.7
│ │ │   ├─┬ lodash.pad@4.4.0
│ │ │   │ ├── lodash._baseslice@4.0.0
│ │ │   │ ├── lodash._basetostring@4.12.0
│ │ │   │ └── lodash.tostring@4.1.3
│ │ │   ├─┬ lodash.padend@4.5.0
│ │ │   │ ├── lodash._baseslice@4.0.0
│ │ │   │ ├── lodash._basetostring@4.12.0
│ │ │   │ └── lodash.tostring@4.1.3
│ │ │   └─┬ lodash.padstart@4.5.0
│ │ │     ├── lodash._baseslice@4.0.0
│ │ │     ├── lodash._basetostring@4.12.0
│ │ │     └── lodash.tostring@4.1.3
│ │ └─┬ path-array@1.0.1
│ │   └─┬ array-index@1.0.0
│ │     ├─┬ debug@2.2.0
│ │     │ └── ms@0.7.1
│ │     └─┬ es6-symbol@3.0.2
│ │       ├── d@0.1.1
│ │       └─┬ es5-ext@0.10.11
│ │         └── es6-iterator@2.0.0
│ ├── nopt@3.0.6 -> /usr/lib/node_modules/npm/node_modules.bundled/nopt
│ ├── normalize-git-url@3.0.2 -> /usr/lib/node_modules/npm/node_modules.bundled/normalize-git-url
│ ├─┬ normalize-package-data@2.3.5 -> /usr/lib/node_modules/npm/node_modules.bundled/normalize-package-data
│ │ └─┬ is-builtin-module@1.0.0
│ │   └── builtin-modules@1.1.1
│ ├── npm-cache-filename@1.0.2 -> /usr/lib/node_modules/npm/node_modules.bundled/npm-cache-filename
│ ├── npm-install-checks@3.0.0 -> /usr/lib/node_modules/npm/node_modules.bundled/npm-install-checks
│ ├── npm-package-arg@4.2.0 -> /usr/lib/node_modules/npm/node_modules.bundled/npm-package-arg
│ ├─┬ npm-registry-client@7.1.2 -> /usr/lib/node_modules/npm/node_modules.bundled/npm-registry-client
│ │ ├─┬ concat-stream@1.5.1
│ │ │ ├─┬ readable-stream@2.0.6
│ │ │ │ ├── core-util-is@1.0.2
│ │ │ │ ├── isarray@1.0.0
│ │ │ │ ├── process-nextick-args@1.0.7
│ │ │ │ ├── string_decoder@0.10.31
│ │ │ │ └── util-deprecate@1.0.2
│ │ │ └── typedarray@0.0.6
│ │ └── retry@0.8.0
│ ├── npm-user-validate@0.1.4 -> /usr/lib/node_modules/npm/node_modules.bundled/npm-user-validate
│ ├─┬ npmlog@3.1.2 -> /usr/lib/node_modules/npm/node_modules.bundled/npmlog
│ │ ├─┬ are-we-there-yet@1.1.2
│ │ │ └── delegates@1.0.0
│ │ ├── console-control-strings@1.1.0
│ │ ├─┬ gauge@2.6.0
│ │ │ ├── has-color@0.1.7
│ │ │ ├── object-assign@4.1.0
│ │ │ ├── signal-exit@3.0.0
│ │ │ ├─┬ string-width@1.0.1
│ │ │ │ ├─┬ code-point-at@1.0.0
│ │ │ │ │ └── number-is-nan@1.0.0
│ │ │ │ └─┬ is-fullwidth-code-point@1.0.0
│ │ │ │   └── number-is-nan@1.0.0
│ │ │ └── wide-align@1.1.0
│ │ └── set-blocking@2.0.0
│ ├── once@1.3.3 -> /usr/lib/node_modules/npm/node_modules.bundled/once
│ ├── opener@1.4.1 -> /usr/lib/node_modules/npm/node_modules.bundled/opener
│ ├─┬ osenv@0.1.3 -> /usr/lib/node_modules/npm/node_modules.bundled/osenv
│ │ ├── os-homedir@1.0.1
│ │ └── os-tmpdir@1.0.1
│ ├── path-is-inside@1.0.1 -> /usr/lib/node_modules/npm/node_modules.bundled/path-is-inside
│ ├─┬ read@1.0.7 -> /usr/lib/node_modules/npm/node_modules.bundled/read
│ │ └── mute-stream@0.0.5
│ ├── read-cmd-shim@1.0.1 -> /usr/lib/node_modules/npm/node_modules.bundled/read-cmd-shim
│ ├─┬ read-installed@4.0.3 -> /usr/lib/node_modules/npm/node_modules.bundled/read-installed
│ │ └── util-extend@1.0.3
│ ├─┬ read-package-json@2.0.4 -> /usr/lib/node_modules/npm/node_modules.bundled/read-package-json
│ │ ├─┬ glob@6.0.4
│ │ │ ├─┬ minimatch@3.0.0
│ │ │ │ └─┬ brace-expansion@1.1.3
│ │ │ │   ├── balanced-match@0.3.0
│ │ │ │   └── concat-map@0.0.1
│ │ │ └── path-is-absolute@1.0.0
│ │ └─┬ json-parse-helpfulerror@1.0.3
│ │   └── jju@1.3.0
│ ├── read-package-tree@5.1.5 -> /usr/lib/node_modules/npm/node_modules.bundled/read-package-tree
│ ├─┬ readable-stream@2.1.4 -> /usr/lib/node_modules/npm/node_modules.bundled/readable-stream
│ │ ├── buffer-shims@1.0.0
│ │ ├── core-util-is@1.0.2
│ │ ├── isarray@1.0.0
│ │ ├── process-nextick-args@1.0.7
│ │ ├── string_decoder@0.10.31
│ │ └── util-deprecate@1.0.2
│ ├── readdir-scoped-modules@1.0.2 -> /usr/lib/node_modules/npm/node_modules.bundled/readdir-scoped-modules
│ ├── realize-package-specifier@3.0.3 -> /usr/lib/node_modules/npm/node_modules.bundled/realize-package-specifier
│ ├─┬ request@2.72.0 -> /usr/lib/node_modules/npm/node_modules.bundled/request
│ │ ├── aws-sign2@0.6.0
│ │ ├─┬ aws4@1.3.2
│ │ │ └─┬ lru-cache@4.0.1
│ │ │   ├── pseudomap@1.0.2
│ │ │   └── yallist@2.0.0
│ │ ├─┬ bl@1.1.2
│ │ │ └─┬ readable-stream@2.0.6
│ │ │   ├── core-util-is@1.0.2
│ │ │   ├── isarray@1.0.0
│ │ │   ├── process-nextick-args@1.0.6
│ │ │   ├── string_decoder@0.10.31
│ │ │   └── util-deprecate@1.0.2
│ │ ├── caseless@0.11.0
│ │ ├─┬ combined-stream@1.0.5
│ │ │ └── delayed-stream@1.0.0
│ │ ├── extend@3.0.0
│ │ ├── forever-agent@0.6.1
│ │ ├─┬ form-data@1.0.0-rc4
│ │ │ └── async@1.5.2
│ │ ├─┬ har-validator@2.0.6
│ │ │ ├─┬ chalk@1.1.3
│ │ │ │ ├── ansi-styles@2.2.1
│ │ │ │ ├── escape-string-regexp@1.0.5
│ │ │ │ ├── has-ansi@2.0.0
│ │ │ │ └── supports-color@2.0.0
│ │ │ ├─┬ commander@2.9.0
│ │ │ │ └── graceful-readlink@1.0.1
│ │ │ ├─┬ is-my-json-valid@2.13.1
│ │ │ │ ├── generate-function@2.0.0
│ │ │ │ ├─┬ generate-object-property@1.2.0
│ │ │ │ │ └── is-property@1.0.2
│ │ │ │ ├── jsonpointer@2.0.0
│ │ │ │ └── xtend@4.0.1
│ │ │ └─┬ pinkie-promise@2.0.1
│ │ │   └── pinkie@2.0.4
│ │ ├─┬ hawk@3.1.3
│ │ │ ├── boom@2.10.1
│ │ │ ├── cryptiles@2.0.5
│ │ │ ├── hoek@2.16.3
│ │ │ └── sntp@1.0.9
│ │ ├─┬ http-signature@1.1.1
│ │ │ ├── assert-plus@0.2.0
│ │ │ ├─┬ jsprim@1.2.2
│ │ │ │ ├── extsprintf@1.0.2
│ │ │ │ ├── json-schema@0.2.2
│ │ │ │ └── verror@1.3.6
│ │ │ └─┬ sshpk@1.7.4
│ │ │   ├── asn1@0.2.3
│ │ │   ├─┬ dashdash@1.13.0
│ │ │   │ └── assert-plus@1.0.0
│ │ │   ├── ecc-jsbn@0.1.1
│ │ │   ├── jodid25519@1.0.2
│ │ │   ├── jsbn@0.1.0
│ │ │   └── tweetnacl@0.14.3
│ │ ├── is-typedarray@1.0.0
│ │ ├── isstream@0.1.2
│ │ ├── json-stringify-safe@5.0.1
│ │ ├─┬ mime-types@2.1.10
│ │ │ └── mime-db@1.22.0
│ │ ├── node-uuid@1.4.7
│ │ ├── oauth-sign@0.8.1
│ │ ├── qs@6.1.0
│ │ ├── stringstream@0.0.5
│ │ ├── tough-cookie@2.2.2
│ │ └── tunnel-agent@0.4.2
│ ├── retry@0.9.0 -> /usr/lib/node_modules/npm/node_modules.bundled/retry
│ ├── rimraf@2.5.2 -> /usr/lib/node_modules/npm/node_modules.bundled/rimraf
│ ├── semver@5.1.0 -> /usr/lib/node_modules/npm/node_modules.bundled/semver
│ ├── sha@2.0.1 -> /usr/lib/node_modules/npm/node_modules.bundled/sha
│ ├── slide@1.1.6 -> /usr/lib/node_modules/npm/node_modules.bundled/slide
│ ├── sorted-object@2.0.0 -> /usr/lib/node_modules/npm/node_modules.bundled/sorted-object
│ ├── strip-ansi@3.0.1 -> /usr/lib/node_modules/npm/node_modules.bundled/strip-ansi
│ ├─┬ tar@2.2.1 -> /usr/lib/node_modules/npm/node_modules.bundled/tar
│ │ └── block-stream@0.0.8
│ ├── text-table@0.2.0 -> /usr/lib/node_modules/npm/node_modules.bundled/text-table
│ ├── uid-number@0.0.6 -> /usr/lib/node_modules/npm/node_modules.bundled/uid-number
│ ├── umask@1.1.0 -> /usr/lib/node_modules/npm/node_modules.bundled/umask
│ ├─┬ unique-filename@1.1.0 -> /usr/lib/node_modules/npm/node_modules.bundled/unique-filename
│ │ └── unique-slug@2.0.0
│ ├── unpipe@1.0.0 -> /usr/lib/node_modules/npm/node_modules.bundled/unpipe
│ ├─┬ validate-npm-package-license@3.0.1 -> /usr/lib/node_modules/npm/node_modules.bundled/validate-npm-package-license
│ │ ├─┬ spdx-correct@1.0.2
│ │ │ └── spdx-license-ids@1.2.0
│ │ └─┬ spdx-expression-parse@1.0.2
│ │   ├── spdx-exceptions@1.0.4
│ │   └── spdx-license-ids@1.2.0
│ ├─┬ validate-npm-package-name@2.2.2 -> /usr/lib/node_modules/npm/node_modules.bundled/validate-npm-package-name
│ │ └── builtins@0.0.7
│ ├─┬ which@1.2.10 -> /usr/lib/node_modules/npm/node_modules.bundled/which
│ │ └── isexe@1.1.2
│ ├── wrappy@1.0.2 -> /usr/lib/node_modules/npm/node_modules.bundled/wrappy
│ └── write-file-atomic@1.1.4 -> /usr/lib/node_modules/npm/node_modules.bundled/write-file-atomic
└── which@1.0.5

为什么Specs在两个平台上表现不同?

解决方法:

我正在使用grunt(和yeoman),我通过这个命令添加了bower组件:

bower install `package_name` --save

这将自动将它们添加到index.html和karma.conf.js中.但是有一个名为adm-dtp的组件没有自动添加(即使我使用上面的命令).我手动将其添加到karma.conf.js,一切正常.
因此,通用答案应该检查karma.conf.js并确保所有内容都正确加载.这link是相关的.如果你使用grunt和yeoman在//结束凉亭之后添加它们,因为在运行grunt测试后该部分将被覆盖.
karma.conf.js:

config.set({
// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,

// base path, that will be used to resolve files and exclude
basePath: '../',

// testing framework to use (jasmine/mocha/qunit/...)
// as well as any additional frameworks (requirejs/chai/sinon/...)
frameworks: [
  'jasmine'
],

// list of files / patterns to load in the browser
files: [
  'app/scripts/persian.min.js',
  // bower:js
  'bower_components/jquery/dist/jquery.js',
  'bower_components/angular/angular.js',
  'bower_components/bootstrap/dist/js/bootstrap.js',
  'bower_components/angular-animate/angular-animate.js',
  'bower_components/angular-aria/angular-aria.js',
  'bower_components/angular-cookies/angular-cookies.js',
  'bower_components/angular-messages/angular-messages.js',
  'bower_components/angular-resource/angular-resource.js',
  'bower_components/angular-route/angular-route.js',
  'bower_components/angular-sanitize/angular-sanitize.js',
  'bower_components/angular-touch/angular-touch.js',
  'bower_components/angularLocalStorage/dist/angularLocalStorage.min.js',
  'bower_components/ngmap/build/scripts/ng-map.js',
  'bower_components/angular-loading-bar/build/loading-bar.js',
  'bower_components/angular-persian/dist/angularpersian.js',
  'bower_components/caman/dist/caman.min.js',
  'bower_components/caman/dist/caman.full.min.js',
  'bower_components/angular-xeditable/dist/js/xeditable.js',
  'bower_components/moment/moment.js',
  'bower_components/angular-mocks/angular-mocks.js',
  // endbower
  // AFTER END BOWER ADDING BOWER COMPONENTS NOT ADDED AUTOMATICLY:
  'bower_components/adm-dtp/dist/ADM-dateTimePicker.min.js',

  'app/scripts/**/*.js',
  'test/mock/**/*.js',
  'test/spec/**/*.js',
  'app/scripts/controllers/bootstrapController.js'
],

// list of files / patterns to exclude
exclude: [
],

// web server port
port: 8082,

// Start these browsers, currently available:
// - Chrome
// - ChromeCanary
// - Firefox
// - Opera
// - Safari (only Mac)
// - PhantomJS
// - IE (only Windows)
browsers: [
  'PhantomJS',
],

// Which plugins to enable
plugins: [
  'karma-phantomjs-launcher',
  'karma-jasmine'
],

// Continuous Integration mode
// if true, it capture browsers, run tests and exit
singleRun: false,

colors: true,

// level of logging
// possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
logLevel: config.LOG_DISABLE,

// Uncomment the following lines if you are using grunt's server to run the tests
proxies: {
  '/': 'http://localhost:9000/'
},
// URL root prevent conflicts with the site root
// urlRoot: '_karma_'
});

标签:linux,node-js,phantomjs,karma-runner,karma-jasmine
来源: https://codeday.me/bug/20190711/1429391.html