電子冒険:エピソード24:単位テスト電子


前のエピソードではfileInfo ファンクションpreload.js かなり長いので、いくつかのテストを書きましょう.
インストールによって起動できますjest , JavaScriptの最も人気のあるバックエンドテストフレームワークのようです.
$ npm install --save-dev jest
そして、我々はそれを入れることもできますpackage.json 便宜上
    "test": "jest"

プリロードテストの問題js


JavaScriptのテストを整理するための2つのコンベンションがあります__tests__ フォルダのすべての場所に.私は、散乱テストの魅力が全く理解されなかったので、我々はきちんとしたことをしていて、彼ら全員を持っていますspec .
私が試した最初のことはspec/preload.spec.js とインポートpreload.js そこから.残念なことにcontextBridge.exposeInMainWorld 定義されていない.

プリロードを書き換える。js


それで、簡単なことをしましょうpreload.js これには
let { contextBridge } = require("electron")
let api = require("./preload/api")

contextBridge.exposeInMainWorld("api", api)
これはどのような単体テストでも必要ない.それは、後で統合テストによってカバーされます.
そして、コードの残りの部分をpreload.js to preload/api.js , これでexport :
module.exports = {
  directoryContents,
  currentDirectory,
}

テストを加える


私は低レベルシステムコールをチェックすることに興味がありません.
  • spec/preload/examples
  • spec/preload/examples/example_01.md - 5バイトの小さなファイル
  • spec/preload/examples/example_02.md - へのシンボリックリンクexample_01.md
  • spec/preload/examples/example_03 - ディレクトリ
  • spec/preload/examples/example_03/.gitkeep - 空のファイルのため、実際にgitに保存されます.gitが空のディレクトリをしないので
  • spec/preload/examples/example_04 - リンクexample_03
  • spec/preload/examples/missing - 壊れたシンボリック
  • これは私たちのテストに十分です-それは特別なファイルを確認することはありませんし、ファイルを削除したときに我々の機能を実行しているが、あまりにも空想を取得しないでください.
    残念ながらいくつかの問題があります.我々は何が正確になるのか分からないDate リポジトリにファイルを置いてチェックアウトすれば、同じ最後の変更された日付が出てくるという保証はありません.
    それで、私はちょうど線に沿って何かをすると思いました:
    expect(result[0].mtime).toBeInstanceOf(Date)
    
    しかし、それは神秘的に戻りました:
        Expected constructor: Date
        Received constructor: Date
    
    ノードのように見えるDate クラス?それは我々がやっていることに非常に付随的であるので、私はそれをさらに調査しませんでした.誰かが答えを知っているならば、コメントで知らせてください.

    spec / preload / API。京大理


    したがって、ここではspecファイルがあります.
    let path = require('path')
    let api = require("../../preload/api.js")
    
    test("currentDirectory", () => {
      expect(api.currentDirectory()).toEqual(path.join(__dirname, "../.."))
    })
    
    test("directoryContents", async () => {
      let examplesDir = `${__dirname}/examples`
      let result = await api.directoryContents(examplesDir)
    
      expect(result).toMatchObject([
        {
          linkTarget: null,
          name: "example_01.md",
          mtime: expect.anything(),
          size: 6,
          type: "file",
        },
        {
          linkTarget: "example_01.md",
          name: "example_02.md",
          mtime: expect.anything(),
          size: 6,
          type: "file",
        },
        {
          linkTarget: null,
          name: "example_03",
          mtime: expect.anything(),
          type: "directory",
        },
        {
          linkTarget: "example_03",
          name: "example_04",
          mtime: expect.anything(),
          type: "directory",
        },
        {
          linkTarget: "example_05.md",
          name: "missing",
          type: "broken",
        },
      ])
    })
    
    もちろん、我々はより多くのテストを行うことができますが、それはスタートです.

    バックエンドコードをテストする方法


    正直に言うと、我々はその多くのコードをpreload - バックエンドへのいくつかの呼び出しをセットアップするために最小限の作業をするべきです、そして、論理はバックエンドになければなりません.
    我々はバックエンドの何かの非常に類似したテストをすることができます-ちょうど別々のファイルにすべての複雑なロジックを動かして、それらのファイルをテストしてください.これらは通常のノード環境で実行される.
    次に、全体のいくつかの統合テストを追加します.

    結果


    結果を以下に示します.

    次のいくつかのエピソードでは、我々のアプリのいくつかの純粋なフロントエンドのコーディングを行う予定です.
    いつものように.all the code for the episode is here .