Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
Kiro Crewをはじめよう
kizawa2020
1
110
今さら理解するウェブフォントver.2026
takanorip
3
500
The seven pitfalls of AI (revised version)
ufried
0
300
購入ドメインでの課題と取り組み
ykagano
0
150
[AWS 秋のクラウドオペレーション祭り 2026]AWS DevOps Agentで変わるリリースと運用対応 ~リリース管理機能と Directed actions のご紹介~
furuton
4
1.1k
FOSS4Gを活用した自治体業務DXの試み
470715
0
140
全人類(ほぼ)AWS Organizations の上でAWSを利用している、その世界を知る話
htan
1
130
初対面のメンバーがチームを組み、Claude Codeでゼロからサービスをリリース
mkdev10
1
110
AIに攻撃される前に、AIに攻撃させる
tsuchikazu
0
160
無理せず続ける、子育てエンジニアの学び
codmoninc
PRO
0
510
OSC2026on_the-world-is-waiting-for-your-voice.pdf
naruoga
0
360
自分で立ててみるLLMサービス
y_sera15
0
150
Featured
See All Featured
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
490
We Have a Design System, Now What?
morganepeng
55
8.4k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
510
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
58k
Design in an AI World
tapps
1
350
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
350
The Curse of the Amulet
leimatthew05
3
15k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
520
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
The SEO Collaboration Effect
kristinabergwall1
1
590
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
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 デファクトスタンダード的なものは特になさそう。