Есть ли способ использовать MongoDB с TestCafe? - PullRequest
0 голосов
/ 07 мая 2019

Как получить значение из MongoDB в работающем тесте TestCafe, чтобы оно выводило это значение во время теста?У меня есть коллекция MongoDB, заполненная данными, которые я хочу использовать TestCafe во время тестов в реальном времени.Я ожидал использовать .toArray () в файле TestCafe, но, похоже, даже не могу установить соединение с MongoDB.Нигде в Интернете я не нашел решения для этого еще.

Я уже пытался выполнить следующие шаги:

  1. Добавлен MongoClient в мой код test.js (файл TestCafe).
  2. В этом коде япопытался просто отобразить «подключен к базе данных».
  3. Я никогда не вижу «подключен к базе данных» в терминале или где-либо еще.
import { Selector } from 'testcafe';
const MongoClient = require('mongodb').MongoClient
import fs from 'fs';
import { ClientFunction } from 'testcafe';
const assert = require('assert');


// Connection URL
const url = 'mongodb://localhost:27017';

// Database Name
const dbName = 'my_database_name';

// keyword begins as an empty string and is supposed to be populated from DB
var keyword = [];

// Use connect method to connect to the server
MongoClient.connect(url, function(err, client) {
  assert.equal(null, err);
  console.log("Connected successfully to server");

  const db = client.db(dbName);

  const findDocuments = function(db, callback) {
  // Get the documents collection
  const collection = db.collection('my_collection_name');
  // Find some documents
  collection.find({'a': 3}).toArray(function(err, docs) {
    assert.equal(err, null);
    console.log("Found the following records");
    console.log(docs);
    callback(docs);
    keyword.unshift(docs);    
  });
};


  client.close();
});

keyword = keyword[0]

fixture `example`
    .page `https://www.google.com/`;

test('mongodb keyword to google search', async t => {
    await t
     .wait(1000)
     .maximizeWindow()
     .wait(1000)
     .typeText(Selector('input[name="q"]'), keyword) //docs['keyword']
     .wait(1000)
     .presKey('enter') 
        .wait(5000);

});


Итак, я попытался показатьпростой поиск в Google, который пытается вставить ключевое слово из моей коллекции MongoDB в окно поиска Google и нажать кнопку поиска.Это должно быть достаточно просто:

  1. Запустить тест
  2. Предполагается, что для подключения к MongoDB, получите одно ключевое слово из "example_collection"
  3. Введите это ключевое слово в Google инажмите search.

Вместо этого я получаю эту ошибку:

(node:1900) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use|
 Running tests in:
 - Chrome 74.0.3729 / Windows 10.0.0

 example
 × MongoDB keyword to google search

   1) The "text" argument is expected to be a non-empty string, but it was undefined.

      Browser: Chrome 74.0.3729 / Windows 10.0.0

         64 |test('mongodb keyword to google search', async t => {
         65 |    await t
         66 |     .wait(1000)
         67 |     .maximizeWindow()
         68 |     .wait(1000)
       > 69 |     .typeText(Selector('input[name="q"]'), keyword) //docs['keyword']
         70 |     .wait(1000)
         71 |     .presKey('enter')
         72 |        .wait(5000);
         73 |
         74 |});

         at typeText (C:\Users\Eric\Google Drive\!GIF
      PROJECT\JavaScript\NodeJS\TestCafe\stackoverflow_example.js:69:7)
         at test (C:\Users\TestCafe\PROJECT\JavaScript\NodeJS\TestCafe\stackoverflow_example.js:64:1)
         at markeredfn (C:\Users\User\AppData\Roaming\npm\node_modules\testcafe\src\api\wrap-test-function.js:17:28)
         at <anonymous> (C:\Users\User\AppData\Roaming\npm\node_modules\testcafe\src\api\wrap-test-function.js:7:5)
         at fn (C:\Users\User\AppData\Roaming\npm\node_modules\testcafe\src\test-run\index.js:240:19)
         at TestRun._executeTestFn
      (C:\Users\User\AppData\Roaming\npm\node_modules\testcafe\src\test-run\index.js:236:38)
         at _executeTestFn (C:\Users\User\AppData\Roaming\npm\node_modules\testcafe\src\test-run\index.js:289:24)

Пожалуйста, дайте мне знать, если есть решение для этого.Я просто хочу передать данные базы данных (из MongoDB) в TestCafe, чтобы они использовались во время теста (также, если я хочу загрузить URL-адреса из базы данных, мне также нужно это знать).

1/1 ошибка (2 с)

1 Ответ

1 голос
/ 08 мая 2019

MongoClient.connect - это асинхронный API с функцией обратного вызова. Его завершение не гарантируется при доступе к значению keyword в тесте. Вы можете обернуть эту функцию в Promise и использовать ключевое слово await в тесте для извлечения результатов из базы данных:

// Connection URL
const url = 'mongodb://localhost:27017';

// Database Name
const dbName = 'my_database_name';

function findDocs (db) {
    return new Promise((resolve, reject) => {
        const collection = db.collection('my_collection_name');

        // Find some documents
        collection.find({'a': 3}).toArray(function(err, docs) {
            if (err)
                return reject(err);
            console.log("Found the following records");
            console.log(docs);
            resolve(docs);
        });
    });
}

function getClient () {
    return new Promise((resolve, reject) => {
        // Use connect method to connect to the server
        MongoClient.connect(url, function(err, client) {
            if (err)
                return reject(err);

            console.log("Connected successfully to server");

            resolve(client);
        });
    });
}

async function getKeywords () {
    const client = await getClient();
    const db     = client.db(dbName);

    try {
        return await getDocs(db);
    }
    finally {
        client.close();
    }
}

fixture `example`
    .page `https://www.google.com/`;

test('mongodb keyword to google search', async t => {
    const keyword = await getKeywords();

    await t
     .wait(1000)
     .maximizeWindow()
     .wait(1000)
     .typeText(Selector('input[name="q"]'), keyword) //docs['keyword']
     .wait(1000)
     .presKey('enter') 
        .wait(5000);

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...