SQL Server 2017など新しいバージョンのSQL Serverでは取得結果をJsonで保存する機能があります。
このような機能を使用することでNewtonsoft.Json
のJsonConvert
クラスにより、
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 Person
等SQLで取得し保存しています。
そして、JsonConvert.DeserializeObject
メソッドを使ってデシリアライズ、このデータとGetAll
メソッドで取得した結果を比較します。
expectedな値をコードに直書きしていると変更があった際に修正が大変です。
しかし上記のコードにより、テストの際にDBの状態が変わってしまうことがあっても簡単にRepository
のテストが出来ます。
しかし、現実ではSQL Server 2008などレガシーに引きずられてSQL ServerにJsonで保存するような機能が備わっていない場合があります。 その際にVisual Studio Codeの「mssql」機能拡張を利用することで取得結果をJsonで保存することが出来ます。
Visual Studio Codeに上記の機能拡張を追加しましょう。
DBに接続し、select
文を発行すると以下のような画面が表示されます。
Result画面の右端に{ }
のマークがあります。
これをクリックするとJson
で保存することが出来ます。
赤い枠で囲われたボタンをクリックするとすぐにJson
ファイルとして保存が可能です。
このやり方であれば、SQLさえあれば取得系のテストのexpectedなデータは簡単に用意できるようになります。 レガシー環境で開発をしていても出来ることはあるので、このように効率化していきましょう!