Как я могу проверить, имеет ли загруженный и загруженный файл одинаковое содержимое с cypress?

#javascript #automated-tests #cypress #cypress-file-upload

Вопрос:

Я хотел проверить, совпадает ли содержимое загруженного файла и загруженного файла. Итак, вот что я попробовал через cypress:

 it.only(cfg.testname, () => {

    // 1. Login to website, navigate to desired webapge
    // 2. Upload the file
    // 3. Download the file

    // cy.wait(5000)
    
    // 4. Read the uploaded file:
    const fileContent = cy.fixture(_filePath)
    console.log('fixture file path', '======>', _filePath)
    console.log('fixture file content', '=====>', fileContent)
    
    // 5. Read the downloaded file:
    const downloadsFolder = Cypress.config("downloadsFolder")
    const downloadedFileContent = cy.readFile(path.join(downloadsFolder, _fileName))
    console.log('downloaded file path', '======>', path.join(downloadsFolder, fileName))
    console.log('downloaded file content','====>', downloadedFileContent)
    
    // 6. Check if they are equal:
    expect(downloadedFileContent).equals(fileContent)            
}) 
 

Однако, когда я запускаю этот тест, он даже не завершает шаг входа в систему и сразу выдает ошибку утверждения на одном шаге 6, то есть на expect()... :

 AssertionError: expected { Object (userInvocationStack, specWindow, ...) } to equal { 
Object (userInvocationStack, specWindow, ...) }
    at Context.eval (VM753 tests:224)
 

Когда я комментирую шаг 6 expect()... , он правильно входит в систему, загружает файл и загружает файл. Итак, я почувствовал, что каким-то образом должен заставить процесс подождать, пока загрузка не будет завершена, прежде expect()... чем . Поэтому я попытался раскомментировать cy.wait(5000) , но безрезультатно. Это все еще дает мне вышеуказанную ошибку (с, конечно expect()... , без комментариев).

Q1. Почему такое поведение?
Q2. Как я должен это исправить?

PS: Я получаю кучу ошибок в консоли, которые я не могу понять. Это скриншот консоли:

введите описание изображения здесь

Ответ №1:

Чтение прибора происходит асинхронно, поэтому вам нужно использовать .then() то же самое с cy.readFile()

Использование path.join(downloadsFolder, _fileName) , вероятно, не сработает, так как это команда узла, вместо этого замените шаблон строки

Если у вас сложный файл в формате JSON, также попробуйте .to.deep.eq

 cy.fixture(_filePath).then(fileContent => {
  const downloadsFolder = Cypress.config("downloadsFolder")
  const downloadPath = `${downloadsFolder}/${_fileName}`
  cy.readFile(downloadPath).then(downloadedFileContent => { 
    expect(downloadedFileContent).equals(fileContent)   
    // or may need deep
    // expect(downloadedFileContent).to.deep.eq(fileContent)   
  })
})