質問編集履歴
6
authors追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -35,6 +35,7 @@
|
|
35
35
|
[package]
|
36
36
|
name = "wasm_bindgen_futures_test"
|
37
37
|
version = "0.1.0"
|
38
|
+
authors = ["Akira Kano <a.kano1101@gmail.com>"]
|
38
39
|
edition = "2021"
|
39
40
|
|
40
41
|
[dependencies]
|
5
assert!(false)のコメント文追加
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
【Rust】wasm_bindgen_futures::spawn_localを使ったコードの自動テストが一見パスしている
|
1
|
+
【Rust】wasm_bindgen_futures::spawn_localを使ったコードの自動テストが一見パスしているようにみえるが処理が完了する前にプログラムが終了してしまうようなので解決したい
|
test
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
|
10
10
|
## 発生している問題・エラーメッセージ
|
11
11
|
|
12
|
-
GitHubを用意しました。よろしければこちらも参照お願いします。
|
12
|
+
GitHubを用意しました。よろしければこちらからも確認できますので、参照お願いします。
|
13
13
|
|
14
14
|
[https://github.com/kano1101/wasm_bindgen_futures_test](https://github.com/kano1101/wasm_bindgen_futures_test)
|
15
15
|
|
@@ -43,7 +43,7 @@
|
|
43
43
|
log = "0.4.6"
|
44
44
|
once_cell = "1.16.0"
|
45
45
|
reqwest = { version = "0.11.13", default-features = false, features = ["json"] }
|
46
|
-
serde = { version = "1.0.148", features = ["derive"] }
|
46
|
+
serde = { version = "1.0.148", default-features = false, features = ["derive"] }
|
47
47
|
tokio = { version = "1.22.0", default-features = false, features = ["sync"] }
|
48
48
|
wasm-bindgen-futures = "0.4.33"
|
49
49
|
wasm-bindgen-test = "0.3.33"
|
@@ -201,6 +201,10 @@
|
|
201
201
|
let origin = space::get().await;
|
202
202
|
assert!(origin.is_some());
|
203
203
|
log::debug!("ip.origin: {:?}", origin);
|
204
|
+
|
205
|
+
// 当然ですがコメントアウトを外すと、localhost:8080からの実行ではエラーになる
|
206
|
+
// しかし自動テストの方ではエラーにならない(処理が到達していないことがわかる)
|
207
|
+
// assert!(false);
|
204
208
|
};
|
205
209
|
|
206
210
|
wasm_bindgen_futures::spawn_local(fut());
|
4
該当のソースコードのリファクタリング
test
CHANGED
File without changes
|
test
CHANGED
@@ -157,8 +157,6 @@
|
|
157
157
|
|
158
158
|
##### main.rs
|
159
159
|
```rust
|
160
|
-
use log::{debug, error, info, trace, warn};
|
161
|
-
|
162
160
|
use serde::Deserialize;
|
163
161
|
#[derive(Deserialize)]
|
164
162
|
struct Ip {
|
@@ -166,18 +164,12 @@
|
|
166
164
|
}
|
167
165
|
|
168
166
|
mod space {
|
169
|
-
use anyhow::Result;
|
170
167
|
use once_cell::sync::Lazy;
|
171
168
|
use tokio::sync::Mutex;
|
172
169
|
|
173
170
|
static INSTANCE: Lazy<Mutex<Option<String>>> = Lazy::new(|| Mutex::new(None));
|
174
171
|
|
175
|
-
pub async fn init() -> Result<()> {
|
176
|
-
let mut lock = INSTANCE.lock().await;
|
177
|
-
*lock = None;
|
178
|
-
Ok(())
|
179
|
-
}
|
180
|
-
pub async fn pull() -> Result<()> {
|
172
|
+
pub async fn pull() -> anyhow::Result<()> {
|
181
173
|
use super::Ip;
|
182
174
|
let response = reqwest::get("http://httpbin.org/ip")
|
183
175
|
.await?
|
@@ -195,26 +187,27 @@
|
|
195
187
|
|
196
188
|
fn run() {
|
197
189
|
console_error_panic_hook::set_once();
|
198
|
-
|
199
190
|
wasm_logger::init(wasm_logger::Config::default());
|
200
191
|
|
201
|
-
trace!("some trace log");
|
192
|
+
log::trace!("some trace log");
|
202
|
-
debug!("some debug log");
|
193
|
+
log::debug!("some debug log");
|
203
|
-
info!("some info log");
|
194
|
+
log::info!("some info log");
|
204
|
-
warn!("some warn log");
|
195
|
+
log::warn!("some warn log");
|
205
|
-
error!("some error log");
|
196
|
+
log::error!("some error log");
|
206
197
|
|
207
198
|
let fut = || async move {
|
208
|
-
assert!(space::get().await.is_none());
|
209
|
-
assert!(space::init().await.is_ok());
|
210
199
|
assert!(space::get().await.is_none());
|
211
200
|
assert!(space::pull().await.is_ok());
|
212
201
|
let origin = space::get().await;
|
213
202
|
assert!(origin.is_some());
|
214
|
-
debug!("ip.origin: {:?}", origin);
|
203
|
+
log::debug!("ip.origin: {:?}", origin);
|
215
204
|
};
|
216
205
|
|
217
206
|
wasm_bindgen_futures::spawn_local(fut());
|
207
|
+
}
|
208
|
+
|
209
|
+
fn main() {
|
210
|
+
run();
|
218
211
|
}
|
219
212
|
|
220
213
|
use wasm_bindgen_test::wasm_bindgen_test;
|
@@ -223,10 +216,6 @@
|
|
223
216
|
|
224
217
|
#[wasm_bindgen_test]
|
225
218
|
async fn first_test() {
|
226
|
-
run();
|
227
|
-
}
|
228
|
-
|
229
|
-
fn main() {
|
230
219
|
run();
|
231
220
|
}
|
232
221
|
```
|
3
該当するソースコード(main.rs)が見にくかったので見やすく修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -113,7 +113,8 @@
|
|
113
113
|
|
114
114
|

|
115
115
|
|
116
|
+
上図のように、コンソールログに`ip.origin: XXX`が表示されています。
|
116
|
-
|
117
|
+
この出力から、プログラムが正しく動作していることが確認できました。
|
117
118
|
|
118
119
|
## 問題となっている自動テストについて
|
119
120
|
下記コマンドを実行します。
|
@@ -159,79 +160,40 @@
|
|
159
160
|
use log::{debug, error, info, trace, warn};
|
160
161
|
|
161
162
|
use serde::Deserialize;
|
162
|
-
#[derive(
|
163
|
+
#[derive(Deserialize)]
|
163
164
|
struct Ip {
|
164
165
|
origin: String,
|
165
166
|
}
|
166
167
|
|
167
|
-
#[derive(Debug, Clone)]
|
168
|
-
enum Perform<T> {
|
169
|
-
None,
|
170
|
-
Yet(T),
|
171
|
-
Already(T),
|
172
|
-
}
|
173
|
-
impl<T> Default for Perform<T> {
|
174
|
-
fn default() -> Perform<T> {
|
175
|
-
Perform::None
|
176
|
-
}
|
177
|
-
}
|
178
|
-
impl<T> From<Perform<T>> for Option<T> {
|
179
|
-
fn from(from: Perform<T>) -> Option<T> {
|
180
|
-
let perform = from;
|
181
|
-
match perform {
|
182
|
-
Perform::None => Option::None,
|
183
|
-
Perform::Yet(_) => Option::None,
|
184
|
-
Perform::Already(t) => Some(t),
|
185
|
-
}
|
186
|
-
}
|
187
|
-
}
|
188
|
-
|
189
168
|
mod space {
|
190
|
-
use
|
169
|
+
use anyhow::Result;
|
191
170
|
use once_cell::sync::Lazy;
|
192
171
|
use tokio::sync::Mutex;
|
172
|
+
|
193
|
-
static INSTANCE: Lazy<Mutex<
|
173
|
+
static INSTANCE: Lazy<Mutex<Option<String>>> = Lazy::new(|| Mutex::new(None));
|
194
|
-
|
174
|
+
|
195
|
-
Mutex::new(perform)
|
196
|
-
});
|
197
|
-
|
198
|
-
pub async fn
|
175
|
+
pub async fn init() -> Result<()> {
|
199
|
-
let mut
|
176
|
+
let mut lock = INSTANCE.lock().await;
|
200
|
-
*
|
177
|
+
*lock = None;
|
201
178
|
Ok(())
|
202
179
|
}
|
203
|
-
|
204
|
-
pub async fn
|
180
|
+
pub async fn pull() -> Result<()> {
|
181
|
+
use super::Ip;
|
205
182
|
let response = reqwest::get("http://httpbin.org/ip")
|
206
183
|
.await?
|
207
184
|
.json::<Ip>()
|
208
185
|
.await?;
|
209
|
-
let mut
|
186
|
+
let mut lock = INSTANCE.lock().await;
|
210
|
-
*
|
187
|
+
*lock = Some(response.origin);
|
211
188
|
Ok(())
|
212
189
|
}
|
213
|
-
pub async fn
|
190
|
+
pub async fn get() -> Option<String> {
|
214
|
-
let l = INSTANCE.lock().await;
|
191
|
+
let lock = INSTANCE.lock().await;
|
215
|
-
let m: Perform<String> = l.clone();
|
216
|
-
|
192
|
+
lock.clone()
|
217
193
|
}
|
218
194
|
}
|
219
195
|
|
220
196
|
fn run() {
|
221
|
-
let fut = || async move {
|
222
|
-
assert!(space::wasm_future_get().await.is_none());
|
223
|
-
assert!(space::wasm_future_init().await.is_ok());
|
224
|
-
assert!(space::wasm_future_get().await.is_none());
|
225
|
-
assert!(space::wasm_future_pull().await.is_ok());
|
226
|
-
let s = space::wasm_future_get().await;
|
227
|
-
assert!(s.is_some());
|
228
|
-
debug!("ip.origin: {:?}", s);
|
229
|
-
};
|
230
|
-
|
231
|
-
wasm_bindgen_futures::spawn_local(fut());
|
232
|
-
}
|
233
|
-
|
234
|
-
fn main() {
|
235
197
|
console_error_panic_hook::set_once();
|
236
198
|
|
237
199
|
wasm_logger::init(wasm_logger::Config::default());
|
@@ -242,7 +204,17 @@
|
|
242
204
|
warn!("some warn log");
|
243
205
|
error!("some error log");
|
244
206
|
|
207
|
+
let fut = || async move {
|
208
|
+
assert!(space::get().await.is_none());
|
209
|
+
assert!(space::init().await.is_ok());
|
210
|
+
assert!(space::get().await.is_none());
|
211
|
+
assert!(space::pull().await.is_ok());
|
212
|
+
let origin = space::get().await;
|
245
|
-
r
|
213
|
+
assert!(origin.is_some());
|
214
|
+
debug!("ip.origin: {:?}", origin);
|
215
|
+
};
|
216
|
+
|
217
|
+
wasm_bindgen_futures::spawn_local(fut());
|
246
218
|
}
|
247
219
|
|
248
220
|
use wasm_bindgen_test::wasm_bindgen_test;
|
@@ -251,18 +223,11 @@
|
|
251
223
|
|
252
224
|
#[wasm_bindgen_test]
|
253
225
|
async fn first_test() {
|
254
|
-
console_error_panic_hook::set_once();
|
255
|
-
|
256
|
-
wasm_logger::init(wasm_logger::Config::default());
|
257
|
-
|
258
|
-
trace!("some trace log");
|
259
|
-
debug!("some debug log");
|
260
|
-
info!("some info log");
|
261
|
-
warn!("some warn log");
|
262
|
-
error!("some error log");
|
263
|
-
|
264
226
|
run();
|
227
|
+
}
|
228
|
+
|
229
|
+
fn main() {
|
265
|
-
|
230
|
+
run();
|
266
231
|
}
|
267
232
|
```
|
268
233
|
|
2
GitHub参照の追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -8,6 +8,10 @@
|
|
8
8
|
- [ ] `wasm_bindgen_futures::spawn_local`を使うコードの自動テストを実行できるようにする
|
9
9
|
|
10
10
|
## 発生している問題・エラーメッセージ
|
11
|
+
|
12
|
+
GitHubを用意しました。よろしければこちらも参照お願いします。
|
13
|
+
|
14
|
+
[https://github.com/kano1101/wasm_bindgen_futures_test](https://github.com/kano1101/wasm_bindgen_futures_test)
|
11
15
|
|
12
16
|
##### プロジェクトの構成
|
13
17
|
```console
|
1
本文わかりやすく修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
【Rust】wasm_bindgen_futures::spawn_localを使ったコードの自動テストがパス
|
1
|
+
【Rust】wasm_bindgen_futures::spawn_localを使ったコードの自動テストが一見パスしているものの処理が完了する前にプログラムが終了してしまうようなので解決したい
|
test
CHANGED
@@ -9,7 +9,10 @@
|
|
9
9
|
|
10
10
|
## 発生している問題・エラーメッセージ
|
11
11
|
|
12
|
+
##### プロジェクトの構成
|
12
|
-
```console
|
13
|
+
```console
|
14
|
+
% pwd
|
15
|
+
/Users/a.kano/development/rust/github_crate/wasm_bindgen_futures_test
|
13
16
|
% tree -L 2 .
|
14
17
|
.
|
15
18
|
|-- Cargo.toml
|
@@ -138,11 +141,12 @@
|
|
138
141
|
font-weight: bold; color: inherit
|
139
142
|
background: inherit; color: inherit
|
140
143
|
```
|
141
|
-
自動テスト自体はパスします。
|
144
|
+
上記から、一見すると自動テスト自体はパスしているように見えます。
|
142
|
-
ただ、見る
|
145
|
+
ただ、よく見るとどうやら目的とする処理に辿り着く前にプログラムが終了してしまっているようなのです。
|
143
|
-
うまくテストが実行されていれば、上記のログに`ip.origin: XXX`が出力されているはずです。
|
146
|
+
なぜならうまくテストが実行されていれば、上記のログに`ip.origin: XXX`が出力されているはずです。
|
144
147
|
しかし、該当する出力は確認できないため、自動テストが意味を成していないことがわかります。
|
145
148
|
これが、今回の問題です!
|
149
|
+
私は、この非同期の終了を待ちたいです。どうすれば待つことができるでしょうか?
|
146
150
|
|
147
151
|
## 該当のソースコード
|
148
152
|
|