Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Simple Mocking in Rust
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Takanori Ishibashi
September 05, 2018
Technology
2k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Simple Mocking in Rust
Takanori Ishibashi
September 05, 2018
Other Decks in Technology
See All in Technology
第3回しろおびセキュリティスポンサーセッション
log0417
0
170
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
1
540
猫付きpingコマンドを自作
uyuki234
0
220
FPGAが実現する遠方宇宙の高空間分解能天体撮影 -大型地上望遠鏡の視力を補正する「補償光学」とは?-
komei_mt
0
230
ブラウザ研修 2026
recruitengineers
PRO
6
970
Genie Codeハンズオン基礎編
taka_aki
1
110
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
9k
【CEDEC2026】コードレビュー支援ツール開発から学ぶ:LLMを用いた業務システムの実践的な運用設計と誤出力対策
cygames
PRO
0
670
20260804_Q4AzureUpdateBite_FabricDataAgentの精度を高める設計.pdf
matayuuu
1
130
同じWAFが、攻撃の“形”は弾く── 正当な“形”の不正は通す
kuroneko13
0
170
カートの信頼性を担保するWireMockを使ったe2eテスト
ykagano
0
220
今こそ聞きたいソフトウェア設計 ドメイン駆動設計再入門
masuda220
PRO
17
7.2k
Featured
See All Featured
Chasing Engaging Ingredients in Design
codingconduct
0
260
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Building AI with AI
inesmontani
PRO
1
1.1k
Google's AI Overviews - The New Search
badams
0
1.1k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
430
The Limits of Empathy - UXLibs8
cassininazir
1
600
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
370
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
990
Designing for humans not robots
tammielis
254
26k
Mind Mapping
helmedeiros
PRO
1
310
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
240
Transcript
Simple Mocking in Rust Rust入門者の集い #5 @11Takanori
About Me • @11Takanori • 仕事だと、主にKotlin、たまにClojure、Dart、ごくたまにRust、 Elixirを使ってる
mockを使いたい理由 マイクロサービスA,B,Cがあるとする 1. マイクロサービスA,B,Cを組み合わせたE2Eを書く 2. マイクロサービスA単独のE2Eを書く ← 別のマイクロサービスをmockしたい 3. 2が通るようになるまで単体テストと実装を繰り返す(クリーンアーキテクチャのレイ
ヤごと) ← 別のレイヤをmockしたい 4. マイクロサービスBに対しても同様 5. マイクロサービスCに対しても同様 6. マイクロサービスA,B,Cを組み合わせたE2Eが通る こんな感じで開発していると、mockしたくなる
単体テストのmock 今回はライブラリを使用せず、ユーザーにメールを 送る処理を素朴にmockする
#[derive(Clone)] struct Email { from: String, to: String, msg: String,
} struct User { address: String, } trait EmailSender { fn send_mail(&self, msg: &Email) -> Result<String, String>; //mock対象 } 実装
// テスト対象 fn publish_news(msg: &str, sender: &EmailSender, users: &[User]) ->
u32 { let mut count = 0; let mut mail = Email { from: "
[email protected]
".to_string(), to: "".to_string(), msg: msg.to_string(), }; for user in users { mail.to = user.address.to_string(); match sender.send_mail(&mail) { // send_mail(&mail)をmockしたい Ok(_) => count += 1, Err(msg) => println!("Failed to send mail: {}", msg), } } count } 実装
struct MockEmailSender { // send_mailの引数の格納先 sent_mails: RefCell<Vec<Email>>, // RefCellは不変値を可変借用できる }
impl MockEmailSender { fn new() -> Self { MockEmailSender { sent_mails: RefCell::new(Vec::new()), } } } impl EmailSender for MockEmailSender { fn send_mail(&self, mail: &Email) -> Result<String, String> { // RefCellに格納しないと&mut selfを使うことになり、シグニチャーが一致しなくなる self.sent_mails.borrow_mut().push(mail.clone()); Ok("200 OK".to_string()) } } テスト
#[test] fn send_mail_to_users() { let user1 = User { address:
"
[email protected]
".to_string(), }; let user2 = User { address: "
[email protected]
".to_string(), }; let send = publish_news("hello world", &MockEmailSender::new(), &[user1, user2]); assert_eq!(send, 2) // 意図した戻り値になっていることをチェック } テスト
#[test] fn send_correct_mail() { let user = User { address:
"
[email protected]
".to_string(), }; let sender = MockEmailSender::new(); publish_news("hello world", &sender, &[user]); let mails = sender.sent_mails.borrow(); // Ref<Vec<Email>> assert_eq!(mails.len(), 1); // send_mailを呼んだ回数をチェック assert_eq!(mails[0].from, "
[email protected]
"); // 引数のチェック assert_eq!(mails[0].to, "
[email protected]
"); // 引数のチェック assert_eq!(mails[0].msg, "hello world"); // 引数のチェック } テスト
Rustのmockライブラリ • Mockers (nightly) • Double • Mock_Derive (nightly) •
Galvanic-mock (nightly) • Pseudo • Mock-it • Simulacrum デファクトスタンダード的なものは特になさそう。