Я слежу за звонками на fillText
на холсте. Мой компонент обновляется каждые 1000 мс. Вот как я это настраиваю:
- В
before
я отправляю данные, которые отображают холст. - В
beforeEach
я получаю контекст и устанавливаю шпиона на textSpy
переменная, которая фиксируется всеми вспомогательными методами. - В тесте я вызываю вспомогательные методы, которые:
- отправляют некоторые новые данные (скажем, это Серия с номером серии 1)
- дождитесь рисования холста (ожидая "Series 1", которая также отображается как html)
- утверждают, что шпион был вызван с текстом, соответствующим длине и идентификационный номер серии.
Удобные методы могут быть немного повсюду / трудно следовать, поэтому я надеюсь, что мое объяснение помогло:
describe('Displaying series after HScroll updates', () => {
const sendSeriesUpTo = (len: number, interval = 0.02) => {
// creates a series of the given length with values the given interval apart
// and sends that series
};
before(setupNonReloadingTests);
after(tearDownNonReloadingTests);
describe('data updates', () => {
let textSpy: SinonSpy;
const getSpy = () => cy.context('series').then(context => textSpy = cy.spy(context, 'fillText'));
// pass in an array of strings that must all have been called, but don't have to be the only calls
const expectTextCall = (textArray: string[]) => {
const textCalls = textSpy.getCalls().map(c => c.args[0]);
textArray.forEach(text => expect(textCalls).to.include(text));
};
const sendAndExpectFrameCount = (frameCount: number, series: string[] = ['1'], allSeries: string = '1') => {
sendSeriesUpTo(frameCount);
cy.contains(`Series: ${ allSeries }`).then(() => {
const arr = [`(${ frameCount } frames)`];
series.forEach(s => arr.push(`SERIES ${ s }`));
expectTextCall(arr);
});
};
const sendAndExpectRange = (from: number, to: number) => {
const diff = to - from + 1;
const array = [...Array(diff).keys()];
array.forEach(n => {
sendAndExpectFrameCount(n + from);
});
};
describe('receiving a single non-overflowing series', () => {
before(() => {
cy.sendStudyUpdateWithSeriesArray([1, 2, 3].map(n => createFdsObject()));
});
beforeEach(() => {
cy.context('series').then(context => textSpy = cy.spy(context, 'fillText'));
});
describe('before overflowing', () => {
it('displays the initial series, ' +
'displays non-overflowing updates to the series', () => {
sendAndExpectRange(80, 85);
});
});
describe('overflowing', () => {
it('scrolls to the end (most current) when a frame is added to overflow the screen', () => {
sendAndExpectFrameCount(90)
});
Хорошо, так что проблема в в том, что первый тест пройден, но второй тест говорит, что у шпиона не было никаких звонков.
Я думаю, что Cypress сбрасывает шпиона по умолчанию между тестами, но я также переустанавливал шпиона в моем beforeEach
. Шпион видит вызовы в первом тесте, но не во втором. Браузер не перезагружается между тестами, поэтому шпион определенно использует один и тот же контекст холста каждый раз.
Что здесь не так!?