お知らせ
現在サイトのリニューアル作業中のため、表示が崩れているページが存在することがあります。
docker-compose up -dした時にコンテナを上げっぱなしにする方法
コンテナ内で開発したいときとかに使える
docker-compose.yamlで上げっぱにしたいサービスにtty: trueを追加するだけ。これ以外だと落ちないプロセスを生やすくらいしかない
services:
foo:
tty: true
Windows 10
| Env | Ver |
|---|---|
| Pandoc | 2.11.4 |
| Java | 1.8.0_291 |
| PlantUML | 1.2021.3 |
パス書式はMSYS2で流す前提
diagram-generator.luaを落としてくるpandoc Foo.md --self-contained -s -c /c/pandoc/github.css --lua-filter=/c/pandoc/diagram-generator.lua --metadata=plantumlPath:"C:\pandoc\plantuml.jar" --metadata=javaPath:"C:\Program Files\Java\jre1.8.0_291\bin\java.exe" -o Foo.html
--self-contained
-s
-c
--lua-filter
--metadata=
基本出来ないのでwindow.location.hrefを操作するためのラッパーを作って、それをjest.spyOn()して解決する
理由はjsdomが対応していないため
global.navigatorをモックにする方法
jestのモック機能はプロパティのモックが出来ないので、実オブジェクトを強制的に書き換えて実施するObject.defineProperty() を利用して実装
value, プロパティが返す値configurable, 再定義可能かどうか、設定しないと再実行でコケるafterAll()でnavigator.userAgentを初期値に戻すのが望ましいObject.defineProperty(global.navigator, 'userAgent', {
value:
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36',
configurable: true,
});
axiosそのものをモックして、その結果に応じた処理が想定通り走っているかどうかを確認したいcreate-react-appで作成したTypeScript Reactのプロジェクトにnpm tを掛けてテストすることを想定| Env | Ver |
|---|---|
| react | 17.0.1 |
| react-scripts | 4.0.2 |
| typescript | 4.1.3 |
import axios from 'axios';
import { useEffect } from 'react';
export const AsyncHookExample = () => {
useEffect(() => {
axios
.get('https://localhost/')
.then((res) => console.log(res))
.catch((err) => console.error(err));
}, []);
return <p />;
};
axiosをモックした上で、モック関数のPromiseの解決を待ち、 PromiseのコールバックをspyOnして検査する内容Promiseの解決法を求めるのにハマりましたが、これはfoo.mock.results[0].valueに対してawait expect(foo.mock.results[0].value).resolvesとしてやればいけるimport { render } from '@testing-library/react';
import axios from 'axios';
import { AsyncHookExample } from './AsyncHookExample';
// `axios` をモックにする
jest.mock('axios');
// `axios` のモックを取得
const mockedAxios = axios as jest.Mocked<typeof axios>;
// `console.log()` を `spyOn'
const spiedConsoleLog = jest.spyOn(console, 'log');
// `console.error()` を `spyOn'
const spiedConsoleError = jest.spyOn(console, 'error');
describe('AsyncHookExample', () => {
it('resolve promise in Hook', async () => {
// テストに期待する結果
// `axios` はモックなので値は適当
const beResult = {
status: 200,
data: null,
};
// `axios` のモックが `resolve` する値を設定
mockedAxios.get.mockResolvedValue(beResult);
// コンポーネントを `render` して `useEffect` を走らせる
render(<AsyncHookExample />);
// `axios.get()` が呼ばれたことを確認
expect(mockedAxios.get).toBeCalled();
// モックの結果を取得
const testResult = mockedAxios.get.mock.results[0].value;
// `reject` された値が期待通りであることを確認
await expect(testResult).resolves.toEqual(beResult);
// `useEffect` の中の `Promise` の中にある `console.log()` が呼ばれたことを確認
expect(spiedConsoleLog).toBeCalled();
});
it('reject promise in Hook', async () => {
// テストに期待する結果
// `axios` はモックなので値は適当
const beResult = {
status: 400,
data: null,
};
// `axios` のモックが `reject` する値を設定
mockedAxios.get.mockRejectedValue(beResult);
// コンポーネントを `render` して `useEffect` を走らせる
render(<AsyncHookExample />);
// `axios.get()` が呼ばれたことを確認
expect(mockedAxios.get).toBeCalled();
// モックの結果を取得
const testResult = mockedAxios.get.mock.results[0].value;
// `reject` された値が期待通りであることを確認
await expect(testResult).rejects.toEqual(beResult);
// `useEffect` の中の `Promise` の中にある `console.error()` が呼ばれたことを確認
expect(spiedConsoleError).toBeCalled();
});
});
mockResolvedValueのスコープやらモックのPromiseを解決させるマッチャやら調べるのに手間取った
Promiseが解決した結果がどこに入るのかとか、兎に角あれこれexpect(mockedAxios.get).toBeCalled()が通るのはすぐに気づいたので、なら出来るだろうとひたすら調べてた