お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。
  • まずhistory.push('/path/to/dest')自体のテストを書くことはないはずなので、何かしらの副作用として実行される事が前提です
  • testing-library.com に書いてあることの応用です
/**
 * useHistory() を使えるようにするテストユーティリティ
 */
const renderWithRouter = (children: JSX.Element, { route = '/' } = {}) => {
  window.history.pushState({}, 'Test page', route);

  return render(children, {
    wrapper: BrowserRouter,
  });
};

// spy 用のモック関数
const mockPush = jest.fn();
// react-router-dom をモックにする
jest.mock('react-router-dom', () => ({
  useHistory: () => ({
    // モック関数を設定
    push: mockPush,
  }),
}));

describe('Bar', () => {
  it('history.push のテスト', () => {
    renderWithRouter(<Bar />, {
      route: '/foo/bar',
    });

    // ここらへんに同期的に副作用を起こす処理を書く
    // 以降、副作用で history.push('/foo/baz') されたとする

    // 呼ばれたことの確認
    expect(mockPush).toBeCalled();
    // 引数の確認
    expect(mockPush.mock.calls[0][0]).toBe('/foo/baz');
  });
});
投稿日:
言語::TypeScriptライブラリ::React

サンプルコード

const onSubmit = (ev: React.FormEvent<HTMLFormElement>) => {
  ev.preventDefault();
  const target = ev.target as typeof ev.target & {
    t1: { value: string };
    t2: { value: string };
  };
  console.log(target.t1.value);
  console.log(target.t2.value);
};
return (
  <div className="App">
    <form onSubmit={(ev) => onSubmit(ev)}>
      <input type="text" id="t1" />
      <input type="text" id="t2" />
      <input type="submit" />
    </form>
  </div>
);

参考

投稿日:
開発::テスト言語::TypeScriptNode.js::Jest
  • fsとかchild_processとかそういうやつをモックする方法
    • jest単体の機能では実現できないのでハマるポイント
  • たぶん jest.MockedFunction でも同じことができる

サンプルコード

import { execSync } from 'child_process';

// まず全体をモックする
jest.mock('child_process');

// モックにする
const mockExecSync = execSync as jest.MockedFunction<typeof execSync>;

describe('execSync', () => {
  it('spyOn execSync', () => {
    // 対象をコール
    execSync('echo 1');
    // 通る
    expect(mockExecSync).toHaveBeenCalled();
    // 通る, echo 2とかにするとちゃんとコケてくれる
    expect(mockExecSync).toHaveBeenCalledWith('echo 1');
  });
});
投稿日:
言語::HTML言語::JavaScript
  • 素のHTMLにJSを埋め込んでイベントコールバックの引数を取る方法
    • イベントコールバックの引数にeventを指定する
      • 例:onclick="test(event)"

サンプルコード

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title>Example of DOM Event callback arguments</title>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <script>
      const test = (ev) => {
        console.log(ev);
      };
    </script>
  </head>
  <body>
    <p onclick="test(event)">aaa</p>
  </body>
</html>
投稿日:
言語::Perl技術::sendmail

文字コードはiso-2022-jp

SMTPの設定例

export EMAIL_SENDER_TRANSPORT=SMTP
export EMAIL_SENDER_TRANSPORT_host=smtp.example.com
export EMAIL_SENDER_TRANSPORT_port=1025

サンプルコード

use strict;
use Email::MIME;
use Email::MIME::Creator;
use Email::Sender::Simple qw(sendmail);

my $subject = Encode::encode('MIME-Header-ISO_2022_JP', 'さぶじぇくと');
my $mail    = Email::MIME->create(
    'header' => [
        'From'    => Encode::encode('MIME-Header-ISO_2022_JP', 'foo@example.com'),
        'To'      => Encode::encode('MIME-Header-ISO_2022_JP', 'to@example.com'),
        'Subject' => $subject,
    ],
    'attributes' => {
        'content_type' => 'text/plain',
        'charset'      => 'ISO-2022-JP',
        'encoding'     => '7bit',
    },
    'body' => Encode::encode('iso-2022-jp', 'ほんぶん!'),
);