Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript SystemJs和jasmine spyOn错误“;模块导出不能从外部更改”;_Javascript_Webpack_Jasmine_Aurelia_Jspm - Fatal编程技术网

Javascript SystemJs和jasmine spyOn错误“;模块导出不能从外部更改”;

Javascript SystemJs和jasmine spyOn错误“;模块导出不能从外部更改”;,javascript,webpack,jasmine,aurelia,jspm,Javascript,Webpack,Jasmine,Aurelia,Jspm,我在一个项目中使用webpack+aurelia,最近切换到JSPM版本0.16.52。我使用jasmine的spyOn实现导入到类中的实用程序或工厂函数。但是,具有spyOn(对象,'method')的测试有以下错误: “无法从外部更改模块导出” 当jasmine在模块obj[methodName]=spiedMethod' 下面是一个非常简单的例子: test.js import * as env from '../../src/env'; describe('stackoverflow

我在一个项目中使用webpack+aurelia,最近切换到JSPM版本0.16.52。我使用jasmine的
spyOn
实现导入到类中的实用程序或工厂函数。但是,具有
spyOn(对象,'method')
的测试有以下错误:

“无法从外部更改模块导出”

当jasmine在模块
obj[methodName]=spiedMethod'

下面是一个非常简单的例子:

test.js

import * as env from '../../src/env';

describe('stackoverflow example', () => {

  it('runs the test', () => {
    // this gets thrown and swallowed. jasmine does not report an error, but does not increase the test count.
    let envSpy = spyOn(env, 'getBaseUrl');
  });

});
export function getBaseUrl(location) {
  return location.port ? `http://${location.hostname}:9001/api/`: '/api/';
}
'use strict'
const path = require('path')

module.exports = function(config) {
  config.set({

    // base path that will be used to resolve all patterns
    basePath: __dirname,

    // frameworks to use
    frameworks: ['jspm', 'jasmine'],

    // list of files / patterns to load in the browser
    files: [],

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

    jspm: {
      // Edit this to your needs
      loadFiles: [
        'test/unit/setup.js',
        'test/unit/**/*.js'
      ],
      serveFiles: [
        'src/**/*.*',
        'jspm_packages/system-polyfills.js'
      ],
      paths: {
        '*': 'src/*',
        'test/*': 'test/*',
        'github:*': 'jspm_packages/github/*',
        'npm:*': 'jspm_packages/npm/*'
      }
    },

    // preprocess matching files before serving them to the browser
    preprocessors: {
      'test/**/*.js': ['babel'],
      'src/**/*.js': ['babel']
    },
    'babelPreprocessor': {
      options: {
        sourceMap: 'inline',
        presets: [ ['es2015', { loose: true }], 'stage-1'],
        plugins: [
          'syntax-flow',
          'transform-decorators-legacy',
          'transform-flow-strip-types',
          [ 'istanbul', { 'ignore': 'test/' } ]
        ]
      }
    },

    // test results reporter to use
    reporters: ['mocha'],

    // web server port
    port: 9876,

    // enable / disable colors in the output (reporters and logs)
    colors: true,

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

    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,

    // start these browsers
    browsers: ['Chromium'],

    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false
  });
};
import 'babel-polyfill'; // for async/await
import 'aurelia-polyfills';
import {initialize} from 'aurelia-pal-browser';
initialize();
{
  __esModule: (...)
  get __esModule: ()
  set __esModule: ()
  getBaseUrl: (...)
  get getBaseUrl: ()
  set getBsaeUrl: ()
  _proto__: Object
}
function getModule(name, loader) {
    var exports;
    var entry = loader.defined[name];

    if (!entry) {
      exports = loader.get(name);
      if (!exports)
        throw new Error('Unable to load dependency ' + name + '.');
    }

    else {
      if (entry.declarative)
        ensureEvaluated(name, entry, [], loader);

      else if (!entry.evaluated)
        linkDynamicModule(entry, loader);

      exports = entry.module.exports;
    }

    if ((!entry || entry.declarative) && exports && exports.__useDefault)
      return exports['default'];

    return exports;
  }
env.js

import * as env from '../../src/env';

describe('stackoverflow example', () => {

  it('runs the test', () => {
    // this gets thrown and swallowed. jasmine does not report an error, but does not increase the test count.
    let envSpy = spyOn(env, 'getBaseUrl');
  });

});
export function getBaseUrl(location) {
  return location.port ? `http://${location.hostname}:9001/api/`: '/api/';
}
'use strict'
const path = require('path')

module.exports = function(config) {
  config.set({

    // base path that will be used to resolve all patterns
    basePath: __dirname,

    // frameworks to use
    frameworks: ['jspm', 'jasmine'],

    // list of files / patterns to load in the browser
    files: [],

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

    jspm: {
      // Edit this to your needs
      loadFiles: [
        'test/unit/setup.js',
        'test/unit/**/*.js'
      ],
      serveFiles: [
        'src/**/*.*',
        'jspm_packages/system-polyfills.js'
      ],
      paths: {
        '*': 'src/*',
        'test/*': 'test/*',
        'github:*': 'jspm_packages/github/*',
        'npm:*': 'jspm_packages/npm/*'
      }
    },

    // preprocess matching files before serving them to the browser
    preprocessors: {
      'test/**/*.js': ['babel'],
      'src/**/*.js': ['babel']
    },
    'babelPreprocessor': {
      options: {
        sourceMap: 'inline',
        presets: [ ['es2015', { loose: true }], 'stage-1'],
        plugins: [
          'syntax-flow',
          'transform-decorators-legacy',
          'transform-flow-strip-types',
          [ 'istanbul', { 'ignore': 'test/' } ]
        ]
      }
    },

    // test results reporter to use
    reporters: ['mocha'],

    // web server port
    port: 9876,

    // enable / disable colors in the output (reporters and logs)
    colors: true,

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

    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,

    // start these browsers
    browsers: ['Chromium'],

    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false
  });
};
import 'babel-polyfill'; // for async/await
import 'aurelia-polyfills';
import {initialize} from 'aurelia-pal-browser';
initialize();
{
  __esModule: (...)
  get __esModule: ()
  set __esModule: ()
  getBaseUrl: (...)
  get getBaseUrl: ()
  set getBsaeUrl: ()
  _proto__: Object
}
function getModule(name, loader) {
    var exports;
    var entry = loader.defined[name];

    if (!entry) {
      exports = loader.get(name);
      if (!exports)
        throw new Error('Unable to load dependency ' + name + '.');
    }

    else {
      if (entry.declarative)
        ensureEvaluated(name, entry, [], loader);

      else if (!entry.evaluated)
        linkDynamicModule(entry, loader);

      exports = entry.module.exports;
    }

    if ((!entry || entry.declarative) && exports && exports.__useDefault)
      return exports['default'];

    return exports;
  }
karam.conf.js

import * as env from '../../src/env';

describe('stackoverflow example', () => {

  it('runs the test', () => {
    // this gets thrown and swallowed. jasmine does not report an error, but does not increase the test count.
    let envSpy = spyOn(env, 'getBaseUrl');
  });

});
export function getBaseUrl(location) {
  return location.port ? `http://${location.hostname}:9001/api/`: '/api/';
}
'use strict'
const path = require('path')

module.exports = function(config) {
  config.set({

    // base path that will be used to resolve all patterns
    basePath: __dirname,

    // frameworks to use
    frameworks: ['jspm', 'jasmine'],

    // list of files / patterns to load in the browser
    files: [],

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

    jspm: {
      // Edit this to your needs
      loadFiles: [
        'test/unit/setup.js',
        'test/unit/**/*.js'
      ],
      serveFiles: [
        'src/**/*.*',
        'jspm_packages/system-polyfills.js'
      ],
      paths: {
        '*': 'src/*',
        'test/*': 'test/*',
        'github:*': 'jspm_packages/github/*',
        'npm:*': 'jspm_packages/npm/*'
      }
    },

    // preprocess matching files before serving them to the browser
    preprocessors: {
      'test/**/*.js': ['babel'],
      'src/**/*.js': ['babel']
    },
    'babelPreprocessor': {
      options: {
        sourceMap: 'inline',
        presets: [ ['es2015', { loose: true }], 'stage-1'],
        plugins: [
          'syntax-flow',
          'transform-decorators-legacy',
          'transform-flow-strip-types',
          [ 'istanbul', { 'ignore': 'test/' } ]
        ]
      }
    },

    // test results reporter to use
    reporters: ['mocha'],

    // web server port
    port: 9876,

    // enable / disable colors in the output (reporters and logs)
    colors: true,

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

    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,

    // start these browsers
    browsers: ['Chromium'],

    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false
  });
};
import 'babel-polyfill'; // for async/await
import 'aurelia-polyfills';
import {initialize} from 'aurelia-pal-browser';
initialize();
{
  __esModule: (...)
  get __esModule: ()
  set __esModule: ()
  getBaseUrl: (...)
  get getBaseUrl: ()
  set getBsaeUrl: ()
  _proto__: Object
}
function getModule(name, loader) {
    var exports;
    var entry = loader.defined[name];

    if (!entry) {
      exports = loader.get(name);
      if (!exports)
        throw new Error('Unable to load dependency ' + name + '.');
    }

    else {
      if (entry.declarative)
        ensureEvaluated(name, entry, [], loader);

      else if (!entry.evaluated)
        linkDynamicModule(entry, loader);

      exports = entry.module.exports;
    }

    if ((!entry || entry.declarative) && exports && exports.__useDefault)
      return exports['default'];

    return exports;
  }
设置,js

import * as env from '../../src/env';

describe('stackoverflow example', () => {

  it('runs the test', () => {
    // this gets thrown and swallowed. jasmine does not report an error, but does not increase the test count.
    let envSpy = spyOn(env, 'getBaseUrl');
  });

});
export function getBaseUrl(location) {
  return location.port ? `http://${location.hostname}:9001/api/`: '/api/';
}
'use strict'
const path = require('path')

module.exports = function(config) {
  config.set({

    // base path that will be used to resolve all patterns
    basePath: __dirname,

    // frameworks to use
    frameworks: ['jspm', 'jasmine'],

    // list of files / patterns to load in the browser
    files: [],

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

    jspm: {
      // Edit this to your needs
      loadFiles: [
        'test/unit/setup.js',
        'test/unit/**/*.js'
      ],
      serveFiles: [
        'src/**/*.*',
        'jspm_packages/system-polyfills.js'
      ],
      paths: {
        '*': 'src/*',
        'test/*': 'test/*',
        'github:*': 'jspm_packages/github/*',
        'npm:*': 'jspm_packages/npm/*'
      }
    },

    // preprocess matching files before serving them to the browser
    preprocessors: {
      'test/**/*.js': ['babel'],
      'src/**/*.js': ['babel']
    },
    'babelPreprocessor': {
      options: {
        sourceMap: 'inline',
        presets: [ ['es2015', { loose: true }], 'stage-1'],
        plugins: [
          'syntax-flow',
          'transform-decorators-legacy',
          'transform-flow-strip-types',
          [ 'istanbul', { 'ignore': 'test/' } ]
        ]
      }
    },

    // test results reporter to use
    reporters: ['mocha'],

    // web server port
    port: 9876,

    // enable / disable colors in the output (reporters and logs)
    colors: true,

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

    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,

    // start these browsers
    browsers: ['Chromium'],

    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false
  });
};
import 'babel-polyfill'; // for async/await
import 'aurelia-polyfills';
import {initialize} from 'aurelia-pal-browser';
initialize();
{
  __esModule: (...)
  get __esModule: ()
  set __esModule: ()
  getBaseUrl: (...)
  get getBaseUrl: ()
  set getBsaeUrl: ()
  _proto__: Object
}
function getModule(name, loader) {
    var exports;
    var entry = loader.defined[name];

    if (!entry) {
      exports = loader.get(name);
      if (!exports)
        throw new Error('Unable to load dependency ' + name + '.');
    }

    else {
      if (entry.declarative)
        ensureEvaluated(name, entry, [], loader);

      else if (!entry.evaluated)
        linkDynamicModule(entry, loader);

      exports = entry.module.exports;
    }

    if ((!entry || entry.declarative) && exports && exports.__useDefault)
      return exports['default'];

    return exports;
  }
更新

当我取下一份新的Aurelia esnext时,我没有收到错误。所以在我的产品应用程序中注释掉了我的所有测试,第一个spyOn成功了,但是当我添加更多测试时,我又开始收到错误,这似乎是systemjs加载模块的方式。下面是导入的模块对象加载到测试中时的外观

新副本不会抛出

{
  __esModule: true,
  getBaseUrl: (),
  __proto__: Object
}
抛出的原始文件

import * as env from '../../src/env';

describe('stackoverflow example', () => {

  it('runs the test', () => {
    // this gets thrown and swallowed. jasmine does not report an error, but does not increase the test count.
    let envSpy = spyOn(env, 'getBaseUrl');
  });

});
export function getBaseUrl(location) {
  return location.port ? `http://${location.hostname}:9001/api/`: '/api/';
}
'use strict'
const path = require('path')

module.exports = function(config) {
  config.set({

    // base path that will be used to resolve all patterns
    basePath: __dirname,

    // frameworks to use
    frameworks: ['jspm', 'jasmine'],

    // list of files / patterns to load in the browser
    files: [],

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

    jspm: {
      // Edit this to your needs
      loadFiles: [
        'test/unit/setup.js',
        'test/unit/**/*.js'
      ],
      serveFiles: [
        'src/**/*.*',
        'jspm_packages/system-polyfills.js'
      ],
      paths: {
        '*': 'src/*',
        'test/*': 'test/*',
        'github:*': 'jspm_packages/github/*',
        'npm:*': 'jspm_packages/npm/*'
      }
    },

    // preprocess matching files before serving them to the browser
    preprocessors: {
      'test/**/*.js': ['babel'],
      'src/**/*.js': ['babel']
    },
    'babelPreprocessor': {
      options: {
        sourceMap: 'inline',
        presets: [ ['es2015', { loose: true }], 'stage-1'],
        plugins: [
          'syntax-flow',
          'transform-decorators-legacy',
          'transform-flow-strip-types',
          [ 'istanbul', { 'ignore': 'test/' } ]
        ]
      }
    },

    // test results reporter to use
    reporters: ['mocha'],

    // web server port
    port: 9876,

    // enable / disable colors in the output (reporters and logs)
    colors: true,

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

    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,

    // start these browsers
    browsers: ['Chromium'],

    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false
  });
};
import 'babel-polyfill'; // for async/await
import 'aurelia-polyfills';
import {initialize} from 'aurelia-pal-browser';
initialize();
{
  __esModule: (...)
  get __esModule: ()
  set __esModule: ()
  getBaseUrl: (...)
  get getBaseUrl: ()
  set getBsaeUrl: ()
  _proto__: Object
}
function getModule(name, loader) {
    var exports;
    var entry = loader.defined[name];

    if (!entry) {
      exports = loader.get(name);
      if (!exports)
        throw new Error('Unable to load dependency ' + name + '.');
    }

    else {
      if (entry.declarative)
        ensureEvaluated(name, entry, [], loader);

      else if (!entry.evaluated)
        linkDynamicModule(entry, loader);

      exports = entry.module.exports;
    }

    if ((!entry || entry.declarative) && exports && exports.__useDefault)
      return exports['default'];

    return exports;
  }
更新 我在system.js中找到了代码片段,其中导入发生了差异。在我较大的原始项目中
loader.defined[name]
返回了未定义的和aurelia
loader.defined[name]的新副本已定义…仍未找到解决方法

system.src.js

import * as env from '../../src/env';

describe('stackoverflow example', () => {

  it('runs the test', () => {
    // this gets thrown and swallowed. jasmine does not report an error, but does not increase the test count.
    let envSpy = spyOn(env, 'getBaseUrl');
  });

});
export function getBaseUrl(location) {
  return location.port ? `http://${location.hostname}:9001/api/`: '/api/';
}
'use strict'
const path = require('path')

module.exports = function(config) {
  config.set({

    // base path that will be used to resolve all patterns
    basePath: __dirname,

    // frameworks to use
    frameworks: ['jspm', 'jasmine'],

    // list of files / patterns to load in the browser
    files: [],

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

    jspm: {
      // Edit this to your needs
      loadFiles: [
        'test/unit/setup.js',
        'test/unit/**/*.js'
      ],
      serveFiles: [
        'src/**/*.*',
        'jspm_packages/system-polyfills.js'
      ],
      paths: {
        '*': 'src/*',
        'test/*': 'test/*',
        'github:*': 'jspm_packages/github/*',
        'npm:*': 'jspm_packages/npm/*'
      }
    },

    // preprocess matching files before serving them to the browser
    preprocessors: {
      'test/**/*.js': ['babel'],
      'src/**/*.js': ['babel']
    },
    'babelPreprocessor': {
      options: {
        sourceMap: 'inline',
        presets: [ ['es2015', { loose: true }], 'stage-1'],
        plugins: [
          'syntax-flow',
          'transform-decorators-legacy',
          'transform-flow-strip-types',
          [ 'istanbul', { 'ignore': 'test/' } ]
        ]
      }
    },

    // test results reporter to use
    reporters: ['mocha'],

    // web server port
    port: 9876,

    // enable / disable colors in the output (reporters and logs)
    colors: true,

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

    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,

    // start these browsers
    browsers: ['Chromium'],

    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false
  });
};
import 'babel-polyfill'; // for async/await
import 'aurelia-polyfills';
import {initialize} from 'aurelia-pal-browser';
initialize();
{
  __esModule: (...)
  get __esModule: ()
  set __esModule: ()
  getBaseUrl: (...)
  get getBaseUrl: ()
  set getBsaeUrl: ()
  _proto__: Object
}
function getModule(name, loader) {
    var exports;
    var entry = loader.defined[name];

    if (!entry) {
      exports = loader.get(name);
      if (!exports)
        throw new Error('Unable to load dependency ' + name + '.');
    }

    else {
      if (entry.declarative)
        ensureEvaluated(name, entry, [], loader);

      else if (!entry.evaluated)
        linkDynamicModule(entry, loader);

      exports = entry.module.exports;
    }

    if ((!entry || entry.declarative) && exports && exports.__useDefault)
      return exports['default'];

    return exports;
  }