shunnami
@shunnami (miffiy)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

[React Testing Library] userEvent.uploadを使ってe.target.valueを取得する方法をご教示いただきたいです。

解決したいこと

userEvent.uploadをつかってテストをしているのですが、テストだとe.target.valueを使ったファイルパスを取得するコードが上手くいきません。
取得方法をご教示いただきたいです。
また、e.target.value以外の方法でパスを取った方が良いのでしょうか。

以上です。
よろしくお願いいたします。

該当するソースコード

// App.tsx
import {getUserNameApi} from './getUserNameApi';
import { useState } from 'react';

export const App = () => {
  const [fileName,setFileName] = useState("");

  const getFileName = (e:React.ChangeEvent<HTMLInputElement>) => {
    if( e.target.files === null){
      return;
    }

// 問題の処理。yarn startで動かした場合は[C:\fakepath\test.txt]のような値が取れる
    const fileNameWithPath = e.target.value;
    setFileName(fileNameWithPath);
  }

  return (
    <div>
      <label htmlFor="file-uploader">test</label>
      <input type="file" id="file-uploader" onChange={(e) => getFileName(e)}/>
      <p>{fileName}</p>
    </div>
  );
}

test("ファイルアップデートテスト",  async() => {

  render(<App/>);

// label要素を取得
  const input = screen.getByLabelText('test') as HTMLInputElement;

// アップロードするファイルを作成
  const file = new File(['a','b','c'], 'test.csv', {type:'text/csv'})

// ファイルのアップロードをする
  await waitFor(() => {
    userEvent.upload(input,file);
  })

  screen.debug();


})
0

1Answer

パスはどうせC:\fakepath\になるので表示する必要があるのかはわかりませんが、ファイル名であればこういう風に取れそうです。

const file = e.target.files[0]
console.log(file.name)
const file = new File(["a", "b", "c"], "test.csv", {
  type: "text/csv"
});
console.log("file.name", file.name);

1Like

Comments

  1. @shunnami

    Questioner

    ご回答ありがとうございます。

    現状fackPathになっておりますが、将来的にはfullPathにしたいと考えております。(方法は調査中)
    ですので、fackPathのままテストを書きたいです。

    fackPathのやり方がわからなかった場合は、ご教示頂いたfilesからファイル名+拡張子の形で表示するようにしたいと思います。

Your answer might help someone💌