嗨,我正在使用构建应用程序AngularJS,现在我正在测试我的应用程序的单元.我知道如何为服务,控制器等编写单元测试用例.但是我不知道是为了写它$routeChangeStart.
我的app.js中有以下代码
app.run(function ($rootScope, $location, AuthenticationService) {
$rootScope.$on('$routeChangeStart', function () {
if (AuthenticationService.isLoggedIn()) {
$rootScope.Authenticated = 'true';
$rootScope.Identity = localStorage.getItem('identification_id');
} else {
$rootScope.Authenticated = 'false';
$rootScope.Identity = localStorage.removeItem('identification_id');
}
});
});
Run Code Online (Sandbox Code Playgroud)
我编写了这段代码,以确定用户是否已登录我的应用程序中的每个路由.我AuthenticationService为此目的写了一个服务;
app.factory('AuthenticationService', function (SessionService) {
return {
isLoggedIn: function () {
return SessionService.get('session_id');
}
};
});
Run Code Online (Sandbox Code Playgroud)
我的会话服务就像;
app.factory('SessionService', function () {
return {
get: function (key) {
return localStorage.getItem(key);
}
};
});
Run Code Online (Sandbox Code Playgroud)
我Jasmine用来编写测试用例和Istanbul用于代码覆盖.当我运行我的测试Grunt时,我在app.js中得到类似的东西;

这是因为我不在我的测试用例中覆盖这些语句,因为我不知道如何为这段特定的代码编写测试用例.有什么建议?
我有一个现有的测试套件,使用mocha,require和jasmine在node.js中运行正常,测试通过psake powershell脚本运行.我正在尝试添加测试覆盖率,因此要运行单元测试而不是执行:
node unitTest.js
我在做
伊斯坦布尔封面unitTest.js
这似乎工作但只给我关于unitTest.js本身的覆盖信息,但没有给出项目中使用的任何其他实际javascript文件.我猜这是因为require/mocha组合所以它不知道我正在使用的js文件.
我尝试手动检测所有文件作为代码覆盖之前的一步,并在复制/检测文件上运行相同的命令但得到相同的结果.有关使这项工作的任何提示?
这是unitTest.js的最后一部分
requirejs(['mocha'], function(Mocha) {
var mocha = new Mocha({reporter: (process.env['TEAMCITY_VERSION'] ? 'teamcity' : 'spec')});
// Hack to establish the global variables (sigh)
mocha.suite.emit('pre-require', global, __filename, mocha);
fswalk(__dirname, function(err, results) {
if (err)
console.warn(err);
else {
var testName = process.argv[2] || "";
console.log("testName: " + testName);
var inclusionSuffixes = [testName + '.test.js'];
var exclusionSuffixes = ['.integration.test.js'];
var tests = _.filter(results, function (result) {
var test = function (suffix) { return result.indexOf(suffix) == result.length …Run Code Online (Sandbox Code Playgroud) 在我的代码中我有 var es = require('event-stream');
在我的package.json中,我有
"scripts": {
"test": "istanbul cover ./node_modules/mocha/bin/_mocha -- -R spec",
}
Run Code Online (Sandbox Code Playgroud)
我只想覆盖我的主文件,但它也涵盖了事件流的文件,所以我得到了类似的东西
=============================== Coverage summary ===============================
Statements : 24.74% ( 757/3060 )
Branches : 5.42% ( 88/1625 )
Functions : 15.56% ( 70/450 )
Lines : 25.37% ( 735/2897 )
================================================================================
Run Code Online (Sandbox Code Playgroud)
有没有办法只覆盖我自己的代码?
我有一组使用 Mocha 和 jsdom 运行的 Web 应用程序的单元测试。我使用 jsdom 而不是真正的浏览器,以便让我的 mocha 单元测试尽可能快地运行,我们将进行集成测试,将运行 selenium,以测试更多真实的浏览器内容。我也使用 istanbul 来生成代码覆盖率报告,但是有些代码无法使用 Mocha/jsdom 进行测试。以这段代码为例:
var myObject = {
//...
/* istanbul ignore next */
_resizeEvent: function() {
if(this.props.isActive) {
//.9 match the scss max-height: 90%, this value needs to be kept in sync with the sass code
this.getDOMNode().querySelector('.modal__content').style.maxHeight = Math.floor(window.innerHeight * .9) + 'px';
this.getDOMNode().querySelector('.modal__content').style.maxWidth = Math.floor(window.innerWidth * .9) + 'px';
this._centerPosition();
}
},
//...
}
Run Code Online (Sandbox Code Playgroud)
由于没有真正的浏览器,这个方法不能真正用jsdom测试。我遇到的问题是,即使我有/* istanbul ignore next */before 对象方法,它仍然告诉我方法中的代码没有被覆盖(而不是只是告诉我它被忽略了)。
有没有一种简单的方法可以完全忽略对象方法及其所有内容,而不必/* istanbul ignore …
我的代码有多个if语句但没有相应的else语句.我一直在/* istanbul ignore else */为所有这些if语句单独添加,以便忽略相应的缺失else块.是否有办法忽略所有遗漏的else陈述?
我正在使用最新的istanbul + jasmine-node来编写我的所有测试脚本.
在一些地方,我有一个可读的流可能会发出error事件,我不知道如何在测试环境中模拟这样的事件,以提供代码覆盖.
请问有人建议如何处理这个问题吗?
我在运行测试时遇到问题,代码覆盖率不起作用,我有消息
没有收集覆盖信息,退出时没有编写覆盖范围信息
我使用ES6编写测试,并使用babel来转换代码.
为了解决这个问题,我使用了本次讨论中提供的github项目:https://github.com/gotwarlost/istanbul/issues/496
诀窍是使用
`babel-node ./node_modules/istanbul/lib/cli cover node_modules/mocha/bin/_mocha -- --require test-helper.js --bail --recursive 'src/js/__tests__/**/*.test.js'`
Run Code Online (Sandbox Code Playgroud)
代替
"istanbul cover node_modules/mocha/bin/_mocha -- --compilers js:babel-core/register --require scripts/test-helper.js --recursive 'src/js/__tests__/**/*.test.js'"
Run Code Online (Sandbox Code Playgroud)
它运行良好,但问题是代码覆盖率只考虑您测试的类,而不是您创建的所有类.
如果我在项目mod.js的src文件夹中添加新类,则app.js组件的覆盖率为100%.这是合乎逻辑的,因为它已经过全面测试,但在报告中,mod.js该类没有出现在报告中 - 它没有被列为0%测试的类(https://github.com/JakeSidSmith/istanbul-no-coverage).
我试图添加cover -x 'src/js/__tests__/**/*.test.js'但不起作用.我不能混合第一种风格和第二种风格.
另一个问题是,在上面提供的项目示例中,test-helper.js被认为是完全测试的,我无法将其从覆盖范围中排除cover -x.
是否有另一个技巧,使用ES6/mocha和mocha调用正确的代码覆盖babel-core/register?
我尝试使用 jest 测试我的 React 应用程序的未经测试的源 js 文件的代码覆盖率,但震惊地发现它对所有文件的代码覆盖率大多为 0%。component.js使用 Jest测试React 文件的代码覆盖率是否可以,或者我在这里做错了什么。
这是我在 package.json 中指定的 jest 配置:
"jest": {
"testEnvironment": "node",
"collectCoverageFrom" : ["**/src/**/*.js"]
}
Run Code Online (Sandbox Code Playgroud)
我的覆盖率快照:
我不相信 0% 的代码语句正在为所有文件执行。我在这里缺少什么吗?这个报告适用于 es6 应用程序吗?我什至通过弹出 webpack 测试了使用 react cli create-react-app 创建的 react 样板应用程序的代码覆盖率。甚至样板应用程序也将未经测试的 js 文件的代码覆盖率显示为 0%。这是 100% 错误的。对这个结果有什么想法吗?
我正在尝试将我的istanbul代码覆盖率命令转换为nyc.
现在似乎nyc是 istanbul 测试覆盖率库的命令行界面。
在伊斯坦布尔,我们会得到这样的报道:
istanbul cover foo.js --dir coverage
Run Code Online (Sandbox Code Playgroud)
然后我们会得到一个像这样的综合报告:
istanbul report --dir coverage --include **/*coverage.json lcov
Run Code Online (Sandbox Code Playgroud)
所以我试图确定等效的命令是什么nyc-
要获得 nyc 的报道,我似乎可以这样做:
nyc node foo.js # writes coverage data to .nyc_output
Run Code Online (Sandbox Code Playgroud)
但是当我查看 .nyc_output 时,有一堆 .json 文件,但它们似乎没有任何数据。
如果我尝试获取报告,请使用
nyc report --reporter=lcov
Run Code Online (Sandbox Code Playgroud)
该报告命令似乎没有做任何事情,.nyc_output目录看起来和以前一样:
注意我可以使用配置文件并避免在命令行中使用额外的命令。
我正在使用ESM进行模块加载,然后像这样运行它们...
// More info on why this is needed see (https://github.com/mochajs/mocha/issues/3006)
async function wire(){
await import("./Sanity.spec.mjs");
await import("./Other.spec.mjs");
run();
}
wire();
Run Code Online (Sandbox Code Playgroud)
然后我像这样运行这些测试nyc mocha --delay --exit ./test/suite.js。但是当我运行Istanbul时,似乎无法识别我的进口货,因此无法提供承保范围信息...
3 passing (14ms)
----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files | 0 | 0 | 0 | 0 | |
----------|----------|----------|----------|----------|-------------------|
Run Code Online (Sandbox Code Playgroud)
我如何才能使Istanbul识别ESM加载的代码?
istanbul ×10
mocha.js ×4
jasmine ×3
node.js ×3
javascript ×2
reactjs ×2
unit-testing ×2
angularjs ×1
babeljs ×1
command-line ×1
ecma ×1
ecmascript-6 ×1
jasmine-node ×1
jestjs ×1
nyc ×1
requirejs ×1
stream ×1