Форум программистов, компьютерный форум, киберфорум
Rust
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 22.09.2023
Сообщений: 54

Создать соединение с БД из тестовой функции используя rocket_db_pools

17.03.2025, 17:03. Показов 1489. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Есть простая программа - HTTP-сервис.
При обработке get-запроса программа использует файловую базу данных sqlite. Для работы с БД используется rocket_db_pools.
Все сделано и работает как описано вот в этой статье:
https://docs.rs/rocket_db_pool... _db_pools/

В обычном "рабочем" режиме библиотека rocket "автоматически" вызывает функцию-обработчик get-запроса, и в качестве параметра передает ей объект соединения с БД Connection<Logs>. Этот параметр-объект создается "автоматически" внутри библиотеки rocket.

Проблема возникла при реализации тестовой функции.
Я из тестовой функции хочу вызвать функцию, которая реализует обработку get-запроса. Для этого нужно "вручную" создать объект Connection<Logs> и передать его в обработчик-запроса
Как это сделать?.
Как в тестовой функции "вручную" создать объект Connection<Logs>?
Как создается я так и не смог найти
Подскажите пожалуйста.

Вот весь код:
Кликните здесь для просмотра всего текста

Rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use rocket::get;
use rocket_db_pools::{Connection, Database};
use rocket_db_pools::sqlx::Row;
 
#[derive(Database)]
#[database("data_store")]
struct LogsDB(sqlx::SqlitePool);
 
#[get("/<id>")]
//async fn read(mut db: Connection<Logs>, id: i64) -> Option<Log> {
async fn read(mut db: Connection<LogsDB>, id: i64) {
    let res = sqlx::query("SELECT content FROM logs WHERE id = ?").bind(id)
        .fetch_one(&mut **db).await;
//        .and_then(|r| Ok(log::Log(r.try_get(0)?)))
//        .ok()
}
 
#[cfg(test)]
mod tests {
    use super::*;
 
    #[tokio::test]
    async fn test_load_requests_and_write_updxmlfile() {
 
        let l_rocket = rocket::build().attach(LogsDB::init());
        //let l_database = MarkingDatabase::init();
        let l_db1 = LogsDB::fetch(&l_rocket).unwrap();
        let mut l_db_connection1 = l_db1.aquire().await.unwrap();        
        
        read(l_db_connection1, 50)?;
    }
 
}


В строке "let mut l_db_connection1 = l_db1.aquire().await.unwrap();" надо как-то получить соединение.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.03.2025, 17:03
Ответы с готовыми решениями:

excel. создать таблицу значение кусочно-непрерывной функции y на интервале [xmin; xmax] с шагом h, для расчета функции y используя логические функции

Создать массив используя функции
Необходимо создать массив A, используя функции, по формуле: (pow((a+1)/2,9)-pow((a+1)/2,2)-7)/((pow(a,9)-pow(a,2)+5)(pow(a,9)-pow(a,2)+1))....

Создать алгоритм используя функции
Пусть x0=0 x1=x2=x3=7 xi=xi-3*(1+xi-2)+xi-3/xi-4 Добавлено через 4 минуты нужно решить используя алгоритмы и функции

3
Модератор
 Аватар для Curry
5158 / 3480 / 536
Регистрация: 01.06.2013
Сообщений: 7,542
Записей в блоге: 9
18.03.2025, 04:43
Никто вам не отвечает, а я, к великому сожалению, давно не брал в руки rust.

Почитал https://rocket.rs/guide/v0.5/testing/ , у меня сложилось впечатление что тестировать обработчики запросов нужно не вызывая их напрямую, а через сам rocket создавая client-а
https://api.rocket.rs/v0.5/rocket/local/#client
2
0 / 0 / 0
Регистрация: 22.09.2023
Сообщений: 54
18.03.2025, 11:06  [ТС]
Цитата Сообщение от Curry Посмотреть сообщение
у меня сложилось впечатление что тестировать обработчики запросов нужно не вызывая их напрямую, а через сам rocket создавая client-а
Я пробовал так делать.
Почему-то при тестировании не выполняется вызов обработчика.

Вот код тестовой функции:
Rust
1
2
3
4
5
6
7
8
    #[test]
    fn test_upd_request_by_http() {
 
        let rocket = rocket::build().attach(LogsDB::init());
        let client = rocket::local::blocking::Client::tracked(rocket).expect("valid rocket instance");
        let response = client.get("/api/v1/updrequest").dispatch();
        assert_eq!(response.status(), rocket::http::Status::Ok);
    }
При выполнении выдается ошибка:
Кликните здесь для просмотра всего текста
---- test_common::tests::test_upd_request_by_ http stdout ----
Configured for debug.
>> address: 127.0.0.1
>> port: 9323
>> workers: 12
>> ident: Rocket
>> limits: UploadUPDRequest = 3MiB, bytes = 8KiB, data-form = 2MiB, file = 1MiB, form = 32KiB, json = 3MiB, msgpack = 1MiB, string = 3MiB
>> temp dir: C:\Users\D899~1\AppData\Local\Temp\
>> http/2: true
>> keep-alive: 5s
>> tls: disabled
>> shutdown: ctrlc = true, force = true, grace = 2s, mercy = 3s
>> log level: normal
>> cli colors: true
Fairings:
>> 'data_store' Database Pool (ignite)
>> Shield (liftoff, response, singleton)
Shield:
>> X-Frame-Options: SAMEORIGIN
>> Permissions-Policy: interest-cohort=()
>> X-Content-Type-Options: nosniff
Rocket has launched into local orbit
POST /api/v1/updrequest:
>> No matching routes for POST /api/v1/updrequest.
>> No 404 catcher registered. Using Rocket default.
thread 'test_common::tests::test_upd_request_by _http' panicked at src\test_common.rs:115:9:
...

Думаю, что это происходит по следующей причине.
Данная программа должна работать и сейчас работает на сервере Linux, на котором все настроено: настроен web-сервер nginx, порты и т.д.

Я же тестирование выполняю на своем компьютере с ОС Windows 11.
У меня локально ничего не настроено для работы веб-сервера. Думаю, что поэтому и обработчик не срабатывает.

Поэтому я в своей "тестовой" среде хотел просто протестировать отдельные процедуры, которые должен выполнить обработчик.
Одна из таких процедур - это работа с БД. Вот я и пытаюсь из тестовой функции вызвать другую функцию, выполняющую работу с БД.
Проблема в том, что туда нужно передать специфический объект типа Connection<LogsDB>.
Этот объект "рождается" внутри библиотеки rocket.
А как его создать вручную - не могу понять
0
Модератор
 Аватар для Curry
5158 / 3480 / 536
Регистрация: 01.06.2013
Сообщений: 7,542
Записей в блоге: 9
18.03.2025, 15:10
Цитата Сообщение от zelenprog Посмотреть сообщение
Почему-то при тестировании не выполняется вызов обработчика.
Rust
1
2
3
#[get("/<id>")]
//async fn read(mut db: Connection<Logs>, id: i64) -> Option<Log> {
async fn read(mut db: Connection<LogsDB>, id: i64) {
А при тестировании запрос другой
Rust
1
let response = client.get("/api/v1/updrequest").dispatch();
Попробуйте
Rust
1
let response = client.get("/28").dispatch();
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.03.2025, 15:10
Помогаю со студенческими работами здесь

Используя функции создать квадратную матрицу
Всем доброго времени суток! Помогите разобраться как решить данное задание: &quot;Написать, используя функции, программу, которая создает...

Создать Simulink модель функции f(t), используя подсистемы.
Ребят начал изучать симулинк...Правильно ли я все сделал? Вот такое задание у меня: Создать Simulink модель функции f(t), провести...

Несколько таблиц создать запрос используя агрегирующие функции
Несколько таблиц создать запрос используя агрегирующие функции; создать запрос для нескольких таблиц используя группировку и итог

Создать файл из 10 структур, используя функции и режим меню
Используя функции и режим меню, создать файл из 10 структур, просмотреть файл, добавить в файл новую информацию и, применяя режим прямого...

Создать программу вычисления значения функции используя циклические структуры
Создать программу вычисления значения функции используя циклические структуры Ввести входные данные и вывести на экран входящие данные и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru