我知道在摘要周期中调用$digest
或$apply
手动会导致"$ digest已在进行中"错误,但我不知道为什么我在这里得到它.
这是一个包装服务的单元测试$http
,服务很简单,只是防止对服务器进行重复调用,同时确保尝试执行调用的代码仍然获得预期的数据.
angular.module('services')
.factory('httpService', ['$http', function($http) {
var pendingCalls = {};
var createKey = function(url, data, method) {
return method + url + JSON.stringify(data);
};
var send = function(url, data, method) {
var key = createKey(url, data, method);
if (pendingCalls[key]) {
return pendingCalls[key];
}
var promise = $http({
method: method,
url: url,
data: data
});
pendingCalls[key] = promise;
promise.then(function() {
delete pendingCalls[key];
});
return promise;
};
return {
post: function(url, data) {
return …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Jasmine测试我的chrome扩展,但是我无法获得calls.length
并按callCount
预期行事.这两种情况下返回undefined
.
我已经包含了代码和规范的示例.如果有帮助的话,这是代码的其余部分:https://github.com/DruRly/kamikaze/tree/closeIdleTab
如何重现:
git clone https://github.com/DruRly/kamikaze/tree/closeIdleTab
cd kamikaze
open SpecRunner.html
投机/ kamikazeSpec.js
describe("kamikaze", function() {
describe("closeIdleTabs", function(){
it("calls closeIdleTab for each tab received", function(){
spyOn(kamikaze, 'closeIdleTab');
kamikaze.closeIdleTabs([1,2,3]);
expect(kamikaze.closeIdleTab.calls.length).toBe(3);
})
})
})
Run Code Online (Sandbox Code Playgroud)
SRC/kamikaze.js
kamikaze = {
...
closeIdleTabs: function(tabs){
tabs.forEach(function(tab){
test.closeIdleTab(tab);
})
},
closeIdleTab: function(tab){
if(tabTimeStamps[tab.id]){
var secondsSinceUpdated = getSecondsSinceUpdated(tab.id)
if(secondsSinceUpdated > (minutesUntilIdle * 60)){
chrome.tabs.remove(tab.id)
}
}
},
...
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Jasmine(2.2.0)间谍来查看是否调用了某个回调.
测试代码:
it('tests', function(done) {
var spy = jasmine.createSpy('mySpy');
objectUnderTest.someFunction(spy).then(function() {
expect(spy).toHaveBeenCalled();
done();
});
});
Run Code Online (Sandbox Code Playgroud)
这按预期工作.但现在,我正在增加第二个级别:
it('tests deeper', function(done) {
var spy = jasmine.createSpy('mySpy');
objectUnderTest.someFunction(spy).then(function() {
expect(spy).toHaveBeenCalled();
spy.reset();
return objectUnderTest.someFunction(spy);
}).then(function() {
expect(spy.toHaveBeenCalled());
expect(spy.callCount).toBe(1);
done();
});
});
Run Code Online (Sandbox Code Playgroud)
此测试永远不会返回,因为显然done
回调从未被调用过.如果我删除该行spy.reset()
,测试确实完成,但显然在最后的期望中失败.然而,这个callCount
领域似乎是undefined
,而不是2
.
我有一个方法,使用a调用d3 timer
.每当调用该方法时,该方法都会发出一个具有几个值的对象.其中一个值随着时间的推移而增加.我想写一个测试来检查值是否按升序排列(即,随着时间的推移而增加).
所以,为了解决这个问题,在我的测试中,我订阅了事件发射器并在订阅内部,我将我收到的对象推送到本地数组中.然后,我期待array[i]
它低于array[i+1]
.我认为我的逻辑完全正确,但我不知道为什么我从Jasmine那里得到一个错误,the spec has no expectations
即使我有一个错误.
这是代码:
let x = d3.timer((elapsed) => {
this.method(); // call the function
if(elapsed >= 500) {
x.stop(); // stops the timer.
}
});
method(elapsed) {
// do something
if(elapsed > 500) {
this.output.emit({x: somevalue, y: somevalue, f: increasingvalue });
}
}
Run Code Online (Sandbox Code Playgroud)
茉莉花规格:
it('my spec', inject([JumpService], (service: JumpService) =>{
array = [];
//service calls the method
service.output.subscribe(e => {
array.push(e);
// A console statement here will …
Run Code Online (Sandbox Code Playgroud) 我维护一个复杂的Angular(1.5.x)应用程序,使用Protractor(2.5.x)进行E2E测试.我遇到了这种方法的问题,主要表现在测试看起来很脆弱的方式.在一个拉取请求中完美运行的测试在另一个拉取请求中失败.这涉及简单的定位器,例如by.linkTest(...).我调试了失败的测试,应用程序位于正确的页面上,链接存在且可访问.
有没有其他人遇到这些一致性问题?了解原因或解决方法?
我不想读几个小时的代码来找到相关的部分,但我很好奇茉莉如何实现它的时钟.有趣的是它可以使用同步测试代码测试异步代码.AFAIK与当前node.js一起支持ES5,这是不可能的(异步函数在ES7中定义).它是用estraverse解析js代码并从同步测试中构建异步测试吗?
只是我所说的一个例子:
it("can test async code with sync testing code", function () {
jasmine.clock().install();
var i = 0;
var asyncIncrease = function () {
setTimeout(function () {
++i;
}, 1);
};
expect(i).toBe(0);
asyncIncrease();
expect(i).toBe(0);
jasmine.clock().tick(2);
expect(i).toBe(1);
jasmine.clock().uninstall();
});
Run Code Online (Sandbox Code Playgroud)
在这里expect(i).toBe(1);
应该是一个回调.
我的protractor
配置文件中的这段代码完美无缺...除了html
onComplete 中的文件创建始终使用上一次测试运行的junitresults xml
文件,而不是在同一配置文件的onPrepare函数中创建的xml文件.所以html页面总是显示测试结果,一个在html页面声明的时间戳后面运行.
一个简单的例子是,如果我从test-results文件夹中的先前测试开始没有xml文件,则html生成器根本找不到用于构建html文件的xml文件,因此不生成html文件.但是新的 xml文件确实显示仍然被创建,放入文件夹,并完全被忽略......直到下一次测试运行.
你能帮助我测试生成一个xml文件,然后用那个 xml文件生成html文件吗?
谢谢!
onPrepare: function() {
var capsPromise = browser.getCapabilities();
capsPromise.then(function(caps) {
browser.browserName = caps.caps_.browserName.replace(/ /g,"-");
browser.browserVersion = caps.caps_.version;
browserName = browser.browserName;
browser.reportPath = 'c:/QA/test-results/' + browser.browserName + '/';
}). then(function(caps) {
var jasmineReporters = require('jasmine-reporters');
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
consolidateAll: true,
savePath: 'c:/QA/test-results/' + browser.browserName + '/',
filePrefix: 'junitresults'
}));
});
return browser.browserName, browser.browserVersion, browser.reportPath;
},
onComplete: function() {
var HTMLReport = require('jasmine-xml2html-converter');
// Call …
Run Code Online (Sandbox Code Playgroud) 我是量角器的新手.此函数中的async/await如何工作?任何人都可以向我解释一下吗?
it('TC_01 - Verify Home page title', async () => {
await headerPage.waitForTitleContain('Homepage', 30000);
await expect(headerPage.getTitle()).toEqual('Homepage');
});
Run Code Online (Sandbox Code Playgroud) 我有 3 个测试,每个测试都测试不同的方法。
it('test function1', function() {
spyOn(document, 'getElementById');
// ... some code to test function1
expect(document.getElementById).toHaveBeenCalled();
});
it('test function2', function() {
spyOn(document, 'getElementById');
// ... some code to test function2
expect(document.getElementById).toHaveBeenCalled();
});
it('test function3', function() {
spyOn(document, 'getElementById');
// ... some code to test function3
expect(document.getElementById).toHaveBeenCalled();
});
Run Code Online (Sandbox Code Playgroud)
但是当我运行这些测试时,我收到以下错误:getElementById has already been spied upon
。有人可以解释为什么即使间谍位于不同的测试套件中我也会收到此错误以及如何修复它。
有没有办法打开“无浮动承诺”,但让它忽略“toEqual”、“toBe”等 Jasmine 承诺?我想使用它,但它到处抱怨我的期望语句。
expect(1).toEqual(1) // Would complain about this
Run Code Online (Sandbox Code Playgroud)
jasmine2.0 ×10
jasmine ×8
javascript ×6
protractor ×4
angularjs ×2
typescript ×2
angular ×1
automation ×1
bdd ×1
ecmascript-7 ×1
selenium ×1
spy ×1
tslint ×1