Merge branch '3.99' into 4.0

This commit is contained in:
Steve Gravrock
2021-10-07 10:56:41 -07:00
7 changed files with 571 additions and 78 deletions

View File

@@ -306,13 +306,13 @@ describe('Env', function() {
describe('#xit', function() {
behavesLikeIt('xit');
it('calls spec.pend with "Temporarily disabled with xit"', function() {
var pendSpy = jasmine.createSpy();
it('calls spec.exclude with "Temporarily disabled with xit"', function() {
var excludeSpy = jasmine.createSpy();
spyOn(env, 'it_').and.returnValue({
pend: pendSpy
exclude: excludeSpy
});
env.xit('foo', function() {});
expect(pendSpy).toHaveBeenCalledWith('Temporarily disabled with xit');
expect(excludeSpy).toHaveBeenCalledWith('Temporarily disabled with xit');
});
it('throws an error when it receives a non-fn argument', function() {
@@ -556,5 +556,23 @@ describe('Env', function() {
it('returns a promise', function() {
expect(env.execute()).toBeInstanceOf(Promise);
});
it('should reset the topSuite when run twice', function() {
spyOn(jasmineUnderTest.Suite.prototype, 'reset');
return env
.execute() // 1
.then(function() {
return env.execute(); // 2
})
.then(function() {
var id;
expect(
jasmineUnderTest.Suite.prototype.reset
).toHaveBeenCalledOnceWith();
id = jasmineUnderTest.Suite.prototype.reset.calls.thisFor(0).id;
expect(id).toBeTruthy();
expect(id).toEqual(env.topSuite().id);
});
});
});
});

View File

@@ -149,6 +149,88 @@ describe('Suite', function() {
});
});
describe('attr.autoCleanClosures', function() {
function arrangeSuite(attrs) {
var suite = new jasmineUnderTest.Suite(attrs);
suite.beforeAll(function() {});
suite.beforeEach(function() {});
suite.afterEach(function() {});
suite.afterAll(function() {});
return suite;
}
it('should clean closures when "attr.autoCleanClosures" is missing', function() {
var suite = arrangeSuite({});
suite.cleanupBeforeAfter();
expect(suite.beforeAllFns[0].fn).toBe(null);
expect(suite.beforeFns[0].fn).toBe(null);
expect(suite.afterFns[0].fn).toBe(null);
expect(suite.afterAllFns[0].fn).toBe(null);
});
it('should clean closures when "attr.autoCleanClosures" is true', function() {
var suite = arrangeSuite({ autoCleanClosures: true });
suite.cleanupBeforeAfter();
expect(suite.beforeAllFns[0].fn).toBe(null);
expect(suite.beforeFns[0].fn).toBe(null);
expect(suite.afterFns[0].fn).toBe(null);
expect(suite.afterAllFns[0].fn).toBe(null);
});
it('should NOT clean closures when "attr.autoCleanClosures" is false', function() {
var suite = arrangeSuite({ autoCleanClosures: false });
suite.cleanupBeforeAfter();
expect(suite.beforeAllFns[0].fn).not.toBe(null);
expect(suite.beforeFns[0].fn).not.toBe(null);
expect(suite.afterFns[0].fn).not.toBe(null);
expect(suite.afterAllFns[0].fn).not.toBe(null);
});
});
describe('#reset', function() {
it('should reset the "pending" status', function() {
var suite = new jasmineUnderTest.Suite({});
suite.pend();
suite.reset();
expect(suite.getResult().status).toBe('passed');
});
it('should not reset the "pending" status when the suite was excluded', function() {
var suite = new jasmineUnderTest.Suite({});
suite.exclude();
suite.reset();
expect(suite.getResult().status).toBe('pending');
});
it('should also reset the children', function() {
var suite = new jasmineUnderTest.Suite({});
var child1 = jasmine.createSpyObj(['reset']);
var child2 = jasmine.createSpyObj(['reset']);
suite.addChild(child1);
suite.addChild(child2);
suite.reset();
expect(child1.reset).toHaveBeenCalled();
expect(child2.reset).toHaveBeenCalled();
});
it('should reset the failedExpectations', function() {
var suite = new jasmineUnderTest.Suite({
expectationResultFactory: function(error) {
return error;
}
});
suite.onException(new Error());
suite.reset();
var result = suite.getResult();
expect(result.status).toBe('passed');
expect(result.failedExpectations).toHaveSize(0);
});
});
describe('#onMultipleDone', function() {
it('reports a special error when it is the top suite', function() {
const onLateError = jasmine.createSpy('onLateError');

View File

@@ -1154,4 +1154,211 @@ describe('spec running', function() {
});
});
});
describe('run multiple times', function() {
beforeEach(function() {
env.configure({ autoCleanClosures: false, random: false });
});
it('should be able to run multiple times', function(done) {
var actions = [];
env.describe('Suite', function() {
env.it('spec1', function() {
actions.push('spec1');
});
env.describe('inner suite', function() {
env.it('spec2', function() {
actions.push('spec2');
});
});
});
env.execute(null, function() {
expect(actions).toEqual(['spec1', 'spec2']);
env.execute(null, function() {
expect(actions).toEqual(['spec1', 'spec2', 'spec1', 'spec2']);
done();
});
});
});
it('should reset results between runs', function(done) {
var specResults = {};
var suiteResults = {};
var firstExecution = true;
env.addReporter({
specDone: function(spec) {
specResults[spec.description] = spec.status;
},
suiteDone: function(suite) {
suiteResults[suite.description] = suite.status;
},
jasmineDone: function() {
firstExecution = false;
}
});
env.describe('suite0', function() {
env.it('spec1', function() {
if (firstExecution) {
env.expect(1).toBe(2);
}
});
env.describe('suite1', function() {
env.it('spec2', function() {
if (firstExecution) {
env.pending();
}
});
env.xit('spec3', function() {}); // Always pending
});
env.describe('suite2', function() {
env.it('spec4', function() {
if (firstExecution) {
throw new Error('spec 3 fails');
}
});
});
env.describe('suite3', function() {
env.beforeEach(function() {
throw new Error('suite 3 fails');
});
env.it('spec5', function() {});
});
env.xdescribe('suite4', function() {
// Always pending
env.it('spec6', function() {});
});
env.describe('suite5', function() {
env.it('spec7');
});
});
env.execute(null, function() {
expect(specResults).toEqual({
spec1: 'failed',
spec2: 'pending',
spec3: 'pending',
spec4: 'failed',
spec5: 'failed',
spec6: 'pending',
spec7: 'pending'
});
expect(suiteResults).toEqual({
suite0: 'passed',
suite1: 'passed',
suite2: 'passed',
suite3: 'passed',
suite4: 'pending',
suite5: 'passed'
});
env.execute(null, function() {
expect(specResults).toEqual({
spec1: 'passed',
spec2: 'passed',
spec3: 'pending',
spec4: 'passed',
spec5: 'failed',
spec6: 'pending',
spec7: 'pending'
});
expect(suiteResults).toEqual({
suite0: 'passed',
suite1: 'passed',
suite2: 'passed',
suite3: 'passed',
suite4: 'pending',
suite5: 'passed'
});
done();
});
});
});
it('should execute before and after hooks per run', function(done) {
var timeline = [];
var timelineFn = function(hookName) {
return function() {
timeline.push(hookName);
};
};
var expectedTimeLine = [
'beforeAll',
'beforeEach',
'spec1',
'afterEach',
'beforeEach',
'spec2',
'afterEach',
'afterAll'
];
env.describe('suite0', function() {
env.beforeAll(timelineFn('beforeAll'));
env.beforeEach(timelineFn('beforeEach'));
env.afterEach(timelineFn('afterEach'));
env.afterAll(timelineFn('afterAll'));
env.it('spec1', timelineFn('spec1'));
env.it('spec2', timelineFn('spec2'));
});
env.execute(null, function() {
expect(timeline).toEqual(expectedTimeLine);
timeline = [];
env.execute(null, function() {
expect(timeline).toEqual(expectedTimeLine);
done();
});
});
});
it('should be able to filter out different tests in subsequent runs', function(done) {
var specResults = {};
var focussedSpec = 'spec1';
env.configure({
specFilter: function(spec) {
return spec.description === focussedSpec;
}
});
env.addReporter({
specDone: function(spec) {
specResults[spec.description] = spec.status;
}
});
env.describe('suite0', function() {
env.it('spec1', function() {});
env.it('spec2', function() {});
env.it('spec3', function() {});
});
env.execute(null, function() {
expect(specResults).toEqual({
spec1: 'passed',
spec2: 'excluded',
spec3: 'excluded'
});
focussedSpec = 'spec2';
env.execute(null, function() {
expect(specResults).toEqual({
spec1: 'excluded',
spec2: 'passed',
spec3: 'excluded'
});
focussedSpec = 'spec3';
env.execute(null, function() {
expect(specResults).toEqual({
spec1: 'excluded',
spec2: 'excluded',
spec3: 'passed'
});
done();
});
});
});
});
});
});