有没有办法运行ng test单个文件而不是整个测试套件?理想情况下,我想在编辑文件时获得最快的反馈循环,但是karma在每次保存时执行整个套件,这在构建足够大的测试套件时有点慢.
Jasmine spyOn是改变方法行为的好方法,但有没有办法改变对象的值属性(而不是方法)?代码可能如下所示:
spyOn(myObj, 'valueA').andReturn(1);
expect(myObj.valueA).toBe(1);
Run Code Online (Sandbox Code Playgroud) 我使用Angular-CLI(beta 20)构建了Angular2项目.
有没有办法只针对一个选定的spec文件运行测试?
我曾经有一个基于Angular2快速启动的项目,我可以手动将规范添加到jasmine文件中.但是我不知道如何在业力测试之外设置它,或者如何使用Angular-CLI构建将业力测试限制为特定文件.
我想确认一个值是十进制(或0),因此该数字应大于或等于零且小于1.
describe('percent',function(){
it('should be a decimal', function() {
var percent = insights.percent;
expect(percent).toBeGreaterThan(0);
expect(percent).toBeLessThan(1);
});
});
Run Code Online (Sandbox Code Playgroud)
我如何模仿"> = 0"?
说我在监视这样的方法:
spyOn(util, "foo").andReturn(true);
Run Code Online (Sandbox Code Playgroud)
被测功能util.foo多次调用.
是否有可能true在第一次调用间谍时返回,但false第二次返回?或者有不同的方式来解决这个问题?
在AngularJS中单元测试隔离范围的好方法是什么
指令片段
scope: {name: '=myGreet'},
link: function (scope, element, attrs) {
//show the initial state
greet(element, scope[attrs.myGreet]);
//listen for changes in the model
scope.$watch(attrs.myGreet, function (name) {
greet(element, name);
});
}
Run Code Online (Sandbox Code Playgroud)
我想,以确保指令监听的变化-这并不会与一个孤立的范围内工作:
it('should watch for changes in the model', function () {
var elm;
//arrange
spyOn(scope, '$watch');
//act
elm = compile(validHTML)(scope);
//assert
expect(scope.$watch.callCount).toBe(1);
expect(scope.$watch).toHaveBeenCalledWith('name', jasmine.any(Function));
});
Run Code Online (Sandbox Code Playgroud)
更新: 我通过检查预期观察者是否被添加到子范围来实现它,但它非常脆弱,并且可能以未记录的方式使用访问者(也可能更改,恕不另行通知!).
//this is super brittle, is there a better way!?
elm = compile(validHTML)(scope);
expect(elm.scope().$$watchers[0].exp).toBe('name');
Run Code Online (Sandbox Code Playgroud)
更新2:
正如我所说,这很脆弱!这个想法仍然有效,但在较新版本的AngularJS中,访问者已经从以下scope()变为isolateScope(): …
javascript unit-testing jasmine angularjs angularjs-directive
Jasmine有内置的匹配器toBe和toEqual.如果我有这样的对象:
function Money(amount, currency){
this.amount = amount;
this.currency = currency;
this.sum = function (money){
return new Money(200, "USD");
}
}
Run Code Online (Sandbox Code Playgroud)
并尝试比较new Money(200, "USD")和和的结果,这些内置的匹配器将无法按预期工作.我已经设法基于自定义equals方法和自定义匹配器实现了一种解决方法,但它似乎很有效.
比较Jasmine中对象的标准方法是什么?
在下面的示例测试中,原始提供者名称是APIEndpointProvider,但是对于注入和服务实例化,约定似乎必须注入包含它的下划线.这是为什么?
'use strict';
describe('Provider: APIEndpointProvider', function () {
beforeEach(module('myApp.providers'));
var APIEndpointProvider;
beforeEach(inject(function(_APIEndpointProvider_) {
APIEndpointProvider = _APIEndpointProvider_;
}));
it('should do something', function () {
expect(!!APIEndpointProvider).toBe(true);
});
});
Run Code Online (Sandbox Code Playgroud)
我错过了一个更好的解释是什么?
当单元测试Angular工厂(使用Karma + Jasmine)时,如何将存根依赖注入到被测工厂中?
这是我的工厂:
mod = angular.module('myFactoryMod', []);
mod.factory('myFactory', [
'$log', 'oneOfMyOtherServices', function($log, svc) {
return makeSomethingThatDoesSomethingWithTheseDependencies($log, svc);
}
]);
Run Code Online (Sandbox Code Playgroud)
oneOfMyOtherServices 实例化我的工厂时需要.
这是我的测试:
it('can get an instance of my factory', function() {
var oneOfMyOtherServicesStub;
angular.mock.module('myFactoryMod');
oneOfMyOtherServicesStub = {
someVariable: 1
};
//****How do I get my stub in my target? ****
angular.mock.inject(['myFactory', function(target) {
expect(target).toBeDefined();
}
]);
})
Run Code Online (Sandbox Code Playgroud)
NB我知道这$controller允许控制器,但我没有看到工厂的等价物.
我有使用Jasmine的经验,并且非常喜欢它.有没有人有茉莉花和摩卡的经验,特别是对于Rails?我想知道是否值得转换.
jasmine ×10
javascript ×6
unit-testing ×4
angularjs ×3
angular ×2
angular-cli ×2
karma-runner ×2
bdd ×1
mocha.js ×1
mocking ×1
tdd ×1