Шаблон, который я использую, выглядит следующим образом (хотя я пытаюсь его улучшить),
it('should update last refreshed text', () => {
cy.contains('selector-closest-to-text', 'signature text')
.then(els => {
const before = els[0].textContent; // #1 parse the text
expect(before.length).to.be.above(0); // #2 in case text is empty
cy.wait(1000) // #3 wait a second for new timestamp
cy.get('selector-for-refresh-trigger')... // #4 do something to refresh
cy.contains('selector-closest-to-text', 'signature text')
.should('not.contain', before) // #5 check has actually changed
.then(els=> {
const after = els[0].textContent; // #6 parse again
expect(after.length).to.be.above(0); // #7 in case empty
expect(before).not.to.eq(after); // #8 compare
})
});
});
Примечания:
В вашем случае немного сложно получить только дату и время. Вы можете просто использовать textcontent
, как я, если вы не собираетесь проверять, что другой пользователь обновил расписание, но если вы просто хотите, чтобы дата и время это выражение могли сделать это
const before = els[0].textcontent.split(' ').slice(2).join(' ')
Вы можете извлечь больше, чем просто время обновления, если это так, создайте простую функцию JS за пределами it()
const parseText = (txt) => {
const split = txt.split(' ')
return {
user: split.slice(0,1),
role: split.slice(1,1),
timeRefreshed: split.slice(2).join(' '),
}
}
и используйте ее следующим образом
const user = parseText(els[0].textcontent).user
const role = parseText(els[0].textcontent).role
const before = parseText(els[0].textcontent).timeRefreshed
Это немного грубо, но просто. Может быть улучшено ожиданием изменения текста, может быть достаточно should('not.contain', before)
.
Примечание cy.clock()
, вероятно, не будет работать здесь.
У меня есть кнопка, которую нужно нажать, но, возможно, вам нужно будет набрать какой-то текст, возможно, на другой странице, и в этом случае этот шаг будет состоять из нескольких строк.
<Ч>Поэтому HttpContextBase и HttpContextWrapper были представлены. Вы, вероятно, хотите использовать HttpContextBase и при передаче реального контекста в, использовать new HttpContextWrapper( httpContext )
, хотя, я думаю, что то, что доступно Вам в контроллере, уже имеет тип HttpContextBase. Я создал бы один из них в моем контроллере каждый раз вместо того, чтобы пытаться сослаться на текущий контекст от статического, глобального HttpContext. Текущий экземпляр. Если Вы нуждаетесь в нем в своем представлении, передаете ссылку на Ваш контекст со строгим контролем типов в ViewData.
Я часто копирую HttpContextBase в моих тестах.
class WebInstanceService
{
private HttpContextBase _Context;
public WebInstanceService( ... , HttpContextBase HttpContext )
{
....
_Context = HttpContext;
}
// Methods...
public string GetInstanceVariable(string VariableName)
{
return _Context.Session[VariableName];
}
}
То, что мы делаем, вращать один из них http://haacked.com/archive/2007/06/19/unit-tests-web-code-without-a-web-server-using-httpsimulator.aspx
Легкий как круг, просто instanciate HttpSimulator и заполняют значения и HttpContext. Текущий заполнен тем, что Вы указываете.
IHttpContext - что-то, что находится в MVC, и по-видимому один день будет в веб-формах. Надо надеяться, тем днем будет .net 4
ASP.NET идет с Системой. Сеть. Абстракции, которые включают HttpContextBase, который можно использовать для контакта с HttpContext в ситуации с тестированием.
Я лично абстрагировал бы далеко прямую зависимость от HttpContext.