MSI で (システム状態を変更するカスタムアクションである) deferred custom actions を オーサリングしている時、MSI が失敗してロールバックする 場合に備えて システム状態変更をアンドゥするのに、同等な 一連のロールバック カスタム アクションを提供する事も 必要です。ロールバック動作は 通常、MSI がインストールされているのか 修復されているのか アンインストールされているのか に依存して 異なって作動する必要が あります。これは、一連の遅延カスタムアクションが 成功した場合も失敗した場合も 期待した 通りに働いている事を 確かめるのに、以下のシナリオが それらをコーディングしてテストして いる時に 説明される必要があることを 意味しています:
失敗の場合は たいてい、カスタムアクション コードを直接にユニットテストする事で シミュレートするのが 難しいものです。なぜなら、遅延カスタムアクション コードは 通常、アクティブなインストールセッション中 Windows Installer によって提供される 状態インフォメーションに依存しているからです。結果として、このタイプのテストは たいてい、 本物のインストールシナリオ中に 適切な時に実行されるロールバック カスタムアクションを 生じさせる為に fault injection を必要とします。
WiX は、MSI でロールバック カスタムアクションをテストするのを より簡単にする事を助けるのに WixFailWhenDeferred と呼ばれる シンプルな遅延カスタムアクションを 含んでいます。 WixFailWhenDeferred は、MSI のインストール、修復、アンインストールの間に実行される時、 常に 失敗します。WixFailWhenDeferred カスタムアクションを あなたの MSI に追加する事は、 ロールバック カスタムアクションをテストするのに MSI に容易に失敗を導入する事を 可能にします。
MSI でロールバック カスタムアクションをテストする為に WixFailWhenDeferred カスタム アクションを使うには、3ステップ 必要です:
WiX の WixFailWhenDeferred についてのサポートは、WiX extension library に含まれていて、 使用する前に プロジェクトに追加されなければ なりません。もし コマンドラインで WiX を使って いるなら、light.exe のコマンドラインに 以下を追加する必要があります:
light.exe myproject.wixobj -ext WixUtilExtension
もし Votive を使っているなら、Add Reference dialog を使って extension を追加する事が できます:
WixFailWhenDeferred カスタムアクションへの参照を 追加するには、WiX セットアップ オーサリングで 以下をインクルードします:
<CustomActionRef Id="WixFailWhenDeferred" />
これは WiX に、MSI に WixFailWhenDeferred カスタムアクションを追加させ、 InstallFinalize アクションの前に いますぐスケジュールに入れさせ、プロパティが WIXFAILWHENDEFERRED=1 である場合だけ実行する様に 条件付けさせます。
WixFailWhenDeferred カスタムアクションは、 Windows Installer public property ( 英語 ) WIXFAILWHENDEFERRED=1 の時にだけ実行するように 条件付けられています。WixFailWhenDeferred カスタムアクションへの参照を付けて MSI を ビルドした後、一連のスタンダードなインストールとロールバック テスト シナリオを シミュレートするのに、以下のセットのコマンドラインを使う事ができます: