Мок и тестирование
Фича 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успешно отрабатывает только один раз на поток — проектируйте тесты так, чтобы они не зависели от повторной инициализации глобального контекста.
См. также
- Быстрый старт — код, который вы тестируете
- Примеры —
examples/vanillaсобирается с фичейmock