質問編集履歴

6

authors追加

2022/12/04 02:13

投稿

akira_kano1101
akira_kano1101

スコア25

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)のコメント文追加

2022/12/04 01:56

投稿

akira_kano1101
akira_kano1101

スコア25

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

該当のソースコードのリファクタリング

2022/12/04 01:38

投稿

akira_kano1101
akira_kano1101

スコア25

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)が見にくかったので見やすく修正

2022/12/04 01:31

投稿

akira_kano1101
akira_kano1101

スコア25

test CHANGED
File without changes
test CHANGED
@@ -113,7 +113,8 @@
113
113
 
114
114
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-03/28fe5598-0a8a-4484-9ccd-419ae33ac98b.png)
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(Clone, Deserialize)]
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 super::{Ip, Perform};
169
+ use anyhow::Result;
191
170
  use once_cell::sync::Lazy;
192
171
  use tokio::sync::Mutex;
172
+
193
- static INSTANCE: Lazy<Mutex<Perform<String>>> = Lazy::new(|| {
173
+ static INSTANCE: Lazy<Mutex<Option<String>>> = Lazy::new(|| Mutex::new(None));
194
- let perform = Perform::None;
174
+
195
- Mutex::new(perform)
196
- });
197
-
198
- pub async fn wasm_future_init() -> anyhow::Result<()> {
175
+ pub async fn init() -> Result<()> {
199
- let mut m = INSTANCE.lock().await;
176
+ let mut lock = INSTANCE.lock().await;
200
- *m = Perform::Yet("yet".to_string());
177
+ *lock = None;
201
178
  Ok(())
202
179
  }
203
-
204
- pub async fn wasm_future_pull() -> anyhow::Result<()> {
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 m = INSTANCE.lock().await;
186
+ let mut lock = INSTANCE.lock().await;
210
- *m = Perform::Already(response.origin);
187
+ *lock = Some(response.origin);
211
188
  Ok(())
212
189
  }
213
- pub async fn wasm_future_get() -> Option<String> {
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
- From::from(m)
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
- run()
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
- assert!(true);
230
+ run();
266
231
  }
267
232
  ```
268
233
 

2

GitHub参照の追加

2022/12/04 00:25

投稿

akira_kano1101
akira_kano1101

スコア25

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

本文わかりやすく修正

2022/12/03 23:52

投稿

akira_kano1101
akira_kano1101

スコア25

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