VSCodeの拡張「mssql」で取得結果をJsonで保存して楽々アサーション

SQL Server 2017など新しいバージョンのSQL Serverでは取得結果をJsonで保存する機能があります。

このような機能を使用することでNewtonsoft.JsonJsonConvertクラスにより、 RepositoryクラスのGetAllメソッド等でデータを取得するテストの記述が比較が楽になります。

[
  {
    "id": 1,
    "name": "neko3cs",
    "age": 25
  },
  {
    "id": 2,
    "name": "neko3333333",
    "age": 26
  },
  {
    "id": 3,
    "name": "neko234",
    "age": 27
  }
]
    public class PersonRepositoryFixture
    {
        [Fact]
        public void GetAllFact()
        {
            var json = File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "..", "..", "..", "expected.json"));
            var expectetList = JsonConvert.DeserializeObject<List<Person>>(json);

            var target = new PersonRepository();

            var persons = target.GetAll();

            foreach (var i in Enumerable.Range(0, expectetList.Count))
            {
                Assert.Equal(expectetList[i].Id, persons[i].Id);
                Assert.Equal(expectetList[i].Name, persons[i].Name);
                Assert.Equal(expectetList[i].Age, persons[i].Age);
            }
        }
    }

上記では、JsonファイルにDBからGetAllメソッドで取得されるべきデータをselect * from PersonSQLで取得し保存しています。 そして、JsonConvert.DeserializeObjectメソッドを使ってデシリアライズ、このデータとGetAllメソッドで取得した結果を比較します。

expectedな値をコードに直書きしていると変更があった際に修正が大変です。 しかし上記のコードにより、テストの際にDBの状態が変わってしまうことがあっても簡単にRepositoryのテストが出来ます。

しかし、現実ではSQL Server 2008などレガシーに引きずられてSQL ServerJsonで保存するような機能が備わっていない場合があります。 その際にVisual Studio Codeの「mssql」機能拡張を利用することで取得結果をJsonで保存することが出来ます。

marketplace.visualstudio.com

Visual Studio Codeに上記の機能拡張を追加しましょう。

DBに接続し、select文を発行すると以下のような画面が表示されます。

f:id:neko3cs:20190422224544p:plain

Result画面の右端に{ }のマークがあります。 これをクリックするとJsonで保存することが出来ます。

f:id:neko3cs:20190422224724p:plain

赤い枠で囲われたボタンをクリックするとすぐにJsonファイルとして保存が可能です。

このやり方であれば、SQLさえあれば取得系のテストのexpectedなデータは簡単に用意できるようになります。 レガシー環境で開発をしていても出来ることはあるので、このように効率化していきましょう!