読者です 読者をやめる 読者になる 読者になる

しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

IIS Express TestKit で Outbound Rules のテストを書けるようにした話

IIS

前回作った IIS Express TestKit が Inbound の一部にしか対応出来ていなかったので、少し気合を入れて利用範囲を広げる対応を行いました。はいふりが始まる前だったので少し急ぎました。

タイトルにも書いたように Outbound Rules に対するテストが書けるようになりました。Outbound Rules については IIS 公式サイトにドキュメントがあるので紹介しておきます。

Creating Outbound Rules for URL Rewrite Module : The Official Microsoft IIS Site
Using Outbound Rules to add Web Analytics tracking code : The Official Microsoft IIS Site

ざっくりと説明するとレスポンスをルールベースで書き換える機能です。

面白いことに HTML のタグ単位での書き換えが出来るので、アプリケーションを弄ることなくリソースの向き先を CDN に変えてしまうといったことが簡単にできます。

簡単な Outbound Rule を使ったサンプルを紹介します。まずは HTML です。

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <a class="test" href="/hoge" rel="me">hoge</a>
</body>
</html>

テンプレート的な HTML に a タグを 1 つだけ足してあります。

Outbound Rules では、この a タグに対しての書き換えルールを追加します。今回は /hoge から始まるリンクを /translated 以下に書き換えるルールを作成しておきました。

<outboundRules>
  <rule name="Rewrite" preCondition="IsHTML">
    <match filterByTags="A" pattern="^/(hoge.*)" />
    <action type="Rewrite" value="/translated/{R:1}" />
  </rule>
  <preConditions>
    <preCondition name="IsHTML">
      <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
    </preCondition>
  </preConditions>
</outboundRules>

事前条件として Content-Type が text/html の時だけルールが有効になるようにしています。

使いこなせるととても便利な機能なんですが、この Outbound Rules は書く難易度が Inbound に比べて格段に高いので、簡単にテストを行える環境が欲しかったです。

まだ NuGet には上げてないですが、GitHub に公開している IIS Express TestKit を使うと、Outbound Rules のテストを以下のようなコードで書くことが出来ます。

[Fact]
public void OutboundRuleのテスト()
{
    Iis.Request("/outbound.html", @".\outbound.html")
       .IsHeaderValue("Content-Type", "text/html")
       .HtmlAttribute("a", "href", "/translated/hoge")
       .IsStatusCode(HttpStatusCode.OK);
}

レスポンスヘッダーの値と a タグの href 属性の値をチェックするようなコードになっています。

Request メソッドの引数で、このリクエストで返すコンテンツを指定できるようにしたので、outbound.html というリクエストを投げると、カレントディレクトリの outbound.html を返します。

f:id:shiba-yan:20160626004145p:plain

ちなみにプロジェクト構成は上のような感じです。もうちょっとリクエスト周りは洗練させたい感じがありますが、今後改善して行けたらいいと思ってます。

このテストコードを実行すると成功するので、Outbound Rules の書き換えが正しく動作していることが、簡単に確認できました。Contains メソッドを使うと含まれているか、大雑把に確認も出来ます。

f:id:shiba-yan:20160626002731p:plain

全体的にインターフェースを改善していきたい感じがあるので、そろそろ機能が十分になったと思ったタイミングで見直していく予定です。

追加機能としては、リクエストのパラメータ設定や、Inbound Rules の IsFile / IsDirectory への対応、そして既存の仮想アプリケーションに対して実行できるようにしたいと思います。

IIS Express と xUnit を使って URL Rewrite のテストを書く

IIS

ASP.NET というか IIS を使ってアプリケーション開発を行っている場合、一度はお世話になっていると思う URL Rewrite ですが、割と書き方が難しいです。

IIS Manager にパターンのテストツールはありますが、大した機能は持ってません。

f:id:shiba-yan:20160620115809p:plain

パターンをテストした後は、実際にアクセスして確かめるという手順を踏む場合が多いと思いますが、IIS 以外には自動で行うためのツールも用意されているみたいでした。

mod_rewrite 向けにはあるのに、IIS の URL REwrite 向けにはないことにショックを受けたので、土日を利用して同じような機能を持つライブラリを書きました。

仕組みとしては IIS Express を裏側で立ち上げて、リクエストを投げているだけです。IIS Express はフルの IIS と同じ機能が使える上、コマンドラインから単体実行が簡単に行えるので便利です。

Running IIS Express from the Command Line : The Official Microsoft IIS Site
Reimers.dk - Testing Your Web Application With IIS Express and Unit Tests

テストフレームワークには xUnit を使いました。今のところ他に対応させる気はあまりないです。

Home > xUnit.net

使い方は NuGet でパッケージをインストールするだけで大体は整う感じです。簡単ですね。

当然ながら IIS Express のインストールは必要ですが、Visual Studio をインストールしていれば、同時に IIS Express も入っているはずです。

Install-Package xunit
Install-Package xunit.runner.visualstudio

Install-Package IisExpressTestKit

パッケージ名は変えるかもしれませんが、今はこんな名前になっています。

インストールが完了したら Rewrite.config というファイル名で URL Rewrite の定義を用意します。ファイル名が固定なのは止めたいですが、xUnit の IClassFeature と上手く同居させる方法が浮かびませんでした。

<?xml version="1.0" encoding="utf-8"?>
<rules>
  <rule name="Rewrite" stopProcessing="true">
    <match url=".*" />
    <action type="Rewrite" url="/translated/{R:0}" />
  </rule>
</rules>

作成した Rewrite.config は出力ディレクトリにコピーする設定にしておきます。この辺りもファイル名が固定の弊害なので、将来的には何とかしたい部分ではあります。

f:id:shiba-yan:20160620120739p:plain

準備は出来たので、あとはテストケースを作成します。IisRewriteTestBase クラスを継承して、コンストラクタを作成すればあとは自由にテストを書くことが出来ます。

実際に Inbound の Rewrite ルールに対するテストを書いてみると、以下のような感じになります。

public class UrlRewriteTest : IisRewriteTestBase
{
    public UrlRewriteTest(IisExpressFixture fixture)
        : base(fixture)
    {
    }

    [Fact]
    public void Rewriteルールのテスト()
    {
        Iis.Request("/hoge")
           .IsPath("/translated/hoge")
           .IsStatusCode(HttpStatusCode.OK);

        Iis.Request("/foo/bar/baz")
           .IsPath("/translated/foo/bar/baz")
           .IsStatusCode(HttpStatusCode.OK);
    }
}

流れとしては、指定したパスにリクエストを投げて、書き換えられたパスとステータスコードを確認という感じです。メソッドチェインで比較的わかりやすく書けている気がしています。

このテストを実行すると、裏側で IIS Express が立ち上がってテストケースに書いたとおりにリクエストを投げて、その処理結果を確認していきます。

f:id:shiba-yan:20160619175112p:plain

Rewrite.config に書いた通り、URL Rewrite によってパスが書き換えられるのを、テストすることが出来ました。今のところは Inbound の一部のみ書けるようになってます。

時間があれば IsDirectory や IsFile への対応や、Outbound への対応も行いたいです。

有楽町で『帰ってきたヒトラー』を観てきた

映画

f:id:shiba-yan:20160619222212p:plain

今朝 Facebook をダラダラ眺めている時に気になったので、さっそく有楽町の TOHO シネマズシャンテまで足を運んで観てきました。この劇場はミニシアターに近い形態で、こういった作品を上映しているようなので、予告編も気になるものが多かったです。

映画『帰ってきたヒトラー』公式サイト

タイトルからは割とタブー感が溢れる感じですね。どれぐらいかというと、あのおーみさんがチャレンジングな映画と表現するぐらいです。

とは言えジャンルとしてはコメディなので、そこまで踏み込んでいないだろうと日本人的な想像で観に行ったところ、海外との温度差を感じさせられる内容でした。

こっちがタブーだろと思った内容をガンガン扱っていく映画はなかなか経験が無かったです。映画の 7,8 割はコメディらしく笑えます、てか劇場でみんな笑ってました。特にメルケルの言われように。

実際にヒトラーがこのようなプロセスで人の心を掴んでいったと考えると、現在進行形で起きていることについて考えるきっかけにもなってくれそうです。

帰ってきたヒトラー 上 (河出文庫 ウ 7-1)

帰ってきたヒトラー 上 (河出文庫 ウ 7-1)

帰ってきたヒトラー 下 (河出文庫)

帰ってきたヒトラー 下 (河出文庫)

ちょっと原作も読んでみようかなという気になりました。そういえばオデッセイの時も原作を読んでみようかと書いた気がしますけど、まだ読んでません。

こういった内容の映画は、日本だと絶対に作れないと思いました(こなみかん

周りに観てる人がほぼ居ないので、レビューサイトのコメントを読む作業に戻る予定です。東京でも 3 つの映画館でしか上映されてないですが、じわじわと評価されそうな映画です。