Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Мок и тестирование

Фича mock устанавливает настраиваемый поддельный объект Telegram.WebApp на window, что позволяет разрабатывать и тестировать вне клиента Telegram. Включите её:

telegram-webapp-sdk = { version = "0.11", features = ["mock"] }

Установка мок-окружения

Мок находится в telegram_webapp_sdk::mock. Соберите MockTelegramConfig (он реализует Default) и вызовите mock_telegram_webapp — он внедрит window.Telegram.WebApp с замоканными initData, themeParams, platform и version. Используйте только в debug-сборках.

use telegram_webapp_sdk::mock::{config::MockTelegramConfig, init::mock_telegram_webapp};

fn run() -> Result<(), wasm_bindgen::JsValue> {
let config = MockTelegramConfig::default();
mock_telegram_webapp(config)?;
// window.Telegram.WebApp теперь существует — SDK ведёт себя как внутри Telegram.
Ok(())
}

Настройка замоканных данных

MockTelegramConfig содержит опциональные поля для пользователя, данных авторизации, всех цветов темы и платформы/версии. Замоканный пользователь — это MockTelegramUser:

use telegram_webapp_sdk::mock::{
    config::MockTelegramConfig, data::MockTelegramUser, init::mock_telegram_webapp,
};

fn run() -> Result<(), wasm_bindgen::JsValue> {
let config = MockTelegramConfig {
    user: Some(MockTelegramUser {
        id: 42,
        first_name: "Alice".into(),
        username: Some("alice".into()),
        language_code: Some("en".into()),
        ..Default::default()
    }),
    platform: Some("android".into()),
    version: Some("9.6".into()),
    ..Default::default()
};
mock_telegram_webapp(config)?;
Ok(())
}

Конфиг можно также загрузить из TOML-файла (тот же telegram-webapp.toml, который telegram_app! читает в debug-сборках):

use telegram_webapp_sdk::mock::config::MockTelegramConfig;

let config = MockTelegramConfig::from_file("telegram-webapp.toml")?;
Ok::<(), std::io::Error>(())

Тестирование через wasm_bindgen_test

Поскольку SDK работает с глобальными объектами браузера, тесты выполняются в headless-браузере через wasm-bindgen-test. Добавьте его в dev-зависимости:

[dev-dependencies]
wasm-bindgen-test = "0.3"

Настройте тесты на запуск в браузере и установите мок перед использованием SDK:

use telegram_webapp_sdk::{
    core::init::init_sdk,
    mock::{config::MockTelegramConfig, init::mock_telegram_webapp},
    webapp::TelegramWebApp,
};
use wasm_bindgen_test::{wasm_bindgen_test, wasm_bindgen_test_configure};

wasm_bindgen_test_configure!(run_in_browser);

#[wasm_bindgen_test]
fn instance_is_available_after_mock() {
    mock_telegram_webapp(MockTelegramConfig::default()).expect("mock installed");
    init_sdk().expect("sdk initialized");

    let app = TelegramWebApp::instance().expect("instance");
    app.ready().expect("ready");
}

Запуск набора тестов на реальном браузерном движке:

# Chrome / Chromium
wasm-pack test --headless --chrome

# или Firefox
wasm-pack test --headless --firefox

Советы

  • В коде приложения предпочитайте TelegramWebApp::instance() (возвращает Option), чтобы один и тот же бинарь корректно деградировал, когда нет ни Telegram, ни мока.
  • Все wasm_bindgen_test разделяют один window; устанавливайте мок в начале каждого теста, которому он нужен, а не полагайтесь на порядок выполнения.
  • Учтите, что TelegramContext::init успешно отрабатывает только один раз на поток — проектируйте тесты так, чтобы они не зависели от повторной инициализации глобального контекста.

См. также