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
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
Mastraエージェント、どのクラウドにデプロイする?
minorun365
PRO
1
130
“ID沼入口” - 基本とセキュリティから始める、考え続けるためのID管理技術勉強会 告知&イントロ
ritou
0
360
認証認可だけじゃない! ID管理の構成要素と ライフサイクルを意識しよう
ritou
1
430
組織における AI-DLC 実践
askul
0
270
フロントエンドイチゲキ実装 ― Figmaデザインと画面設計書からAIに実装・テストを書かせるための”下ごしらえ” / 20260627 Yusuke Mazuka
shift_evolve
PRO
0
120
小さいから、全部わかる。— 常駐AI "xangi" のすすめ
sugupoko
0
220
Hatena Engineer Seminar 37 jj1uzh
jj1uzh
0
400
AWS Summit Japan 2026の振り返りと2027へ向けて / AWS Summit Japan 2026 Recap and Prospects for 2027
kaminashi
1
170
きのこカンファレンス2026_肩書きを外したとき私は誰か
yamasatimi
1
120
40代で“やっとエンジニアになれた”――閉じた学びを開き、空の青さを知る / 20260628 Naoki Takahashi
shift_evolve
PRO
4
1.5k
打造你的 AI 工作流:Agent Skill + MCP 實戰工作坊
appleboy
0
340
Docker Desktop不要の時代が来る? WSL標準の「wslc」で Linuxコンテナを動かしてみた.
ueponx
0
460
Featured
See All Featured
The agentic SEO stack - context over prompts
schlessera
0
840
Building Adaptive Systems
keathley
44
3.1k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
The Pragmatic Product Professional
lauravandoore
37
7.3k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
200
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Discover your Explorer Soul
emna__ayadi
2
1.2k
The browser strikes back
jonoalderson
0
1.3k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.4k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
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 デファクトスタンダード的なものは特になさそう。