karma-runner / karma

Spectacular Test Runner for JavaScript
http://karma-runner.github.io
MIT License
11.96k stars 1.71k forks source link

Does karma has feature to read environmental variables in karma tests? #2066

Open s-sridevi15 opened 8 years ago

s-sridevi15 commented 8 years ago

Can we read environmental variables in karma tests? If yes, can somebody let me know . process.env is not recognized in karma test.

budde377 commented 8 years ago

No. Since the tests are running in the browser, process.env is not available.You can however set the client args. See the documentation at http://karma-runner.github.io/0.13/config/configuration-file.html (search for client.args).

On Thu, Apr 21, 2016, 01:54 s-sridevi15 notifications@github.com wrote:

Can we read environmental variables in karma tests? If yes, can somebody let me know . process.env is not recognized in karma test.

— You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub https://github.com/karma-runner/karma/issues/2066

s-sridevi15 commented 8 years ago

Thanks budde377 for quick reply. So, there is no feature to read environmental variables in karma tests.

When I was researching, I got this information about karma-env-preprocessor(https://www.npmjs.com/package/karma-env-preprocessor), when I tried plugin and run tests(gulp karma -Ddevice_url) through command line by passing environmental variables with -D option, it is not taking reading the variables to window.env . Could you let me know whether karma-env-preprocessor plugin works to read environmental variables in karma tests? If yes, am I passing environmental variables wrong?

If passing and reading environmental variables not possible in karma test, I wiil look for some other work around . Thanks in advance and will appreciate if you can clarify my question

budde377 commented 8 years ago

@s-sridevi15, I don't know about that specific plugin, but as I see it, it should expose the environment variables as the window.__env__ variable, not the window.env variable as you described. Furthermore I don't know about the -D options (outside of Java). Normally I would just set the environment with the good old export command.

I any case, Karma doesn't support exposing environment variables natively, so I would suggest that you contact the karma-env-preprocessor project if your can't seem to get it to work. Hopefully they can provide better support than I.

s-sridevi15 commented 8 years ago

Thanks a lot budde377 for clarification. I am trying other work arounds and will try that.

marcowilliam commented 7 years ago

Any progress with the karma-env-preprocessor plugin ?

camslice commented 7 years ago

Hi folks, if anyone is simply trying to use environment variables defined in a .env file in your karma.config.js file, this plugin will do the trick: https://www.npmjs.com/package/dotenv

You just install the module, then add require('dotenv').config(); to the top of the karma.config.js file and all the environment variables in .env will be appended to process.env.

For example (obviously truncated config for demonstration):

require('dotenv').config();

module.exports = function (config) {
  config.set({
    proxies: {
      '/api': 'http://' + process.env.APP_URL + '/api'
    }
  });
};
edarioq commented 5 years ago

As stated by @camslice works with dotenv. Ex:

'/dist/': 'http://localhost:' + process.env.PORT + '/',

trusktr commented 3 years ago

dotenv might be more than necessary. You can call karma like this to pass env vars into your karma.config.js:

MY_ENV_VAR="blahblah" karma start ./config/karma.config.js

If you need the env vars to be inside of your tests, then one option is to use karma-webpack, which allows you to process test code using Webpack, and Webpack allows you to define global variables that are placed into your code at build time (before karma runs the tests Webpack will compile them).

Even if you don't need to compile anything, you can use karma-webpack just for this purpose. In your karma.config.js file, you can configure webpack like this:

const webpack = require('webpack')

module.exports = {
  webpack: { // this is standard Webpack configuration here (read Webpack docs), use any loaders you want here, or specify env vars:
    // ...

    // For example, pass globals from your CLI command to your test code:
    plugins: [
      new webpack.DefinePlugin({
        MY_ENV_VAR: process.end.MY_ENV_VAR
      })
    ]
  }
}

Now any place in your test code that has MY_ENV_VAR will be replaced with the value that you passed into your MY_ENV_VAR="......." karma start command.