VB.NET とにかく1行に拘る
VSTSを使い始めたんだけど、仕組みはまるっきりJUnit。
すばらしいw
ガシガシ使おうじゃないのww
でも、テストツール系で面倒なのは、input,actual,expectedなデータの準備。
できれば、少ないタイプで、見やすく書きたい!!
たとえば、Javaだとコレクション系のデータの初期化はこんな感じで書ける。
Map<String, String> input = new HashMap<String, String>() { { put("K1", "V1"); put("K2", "V2"); put("K3", "V3"); } };
匿名クラスを定義しつつ、インスタンス初期化子で、スーパークラスのメソッドを呼んじゃうのだ。
# ちなみにLL系だともっと書かなくていい。(たとえばJSON(データ構造だけだもんね))
んが、VB.NETだと...
近いことするためには、ヘルパーメソッドx1とヘルパークラスx1がどうしても必要っぽい。
Dim dic As Dictionary(Of String, Object) = createInstance(New List(Of KV)({ New KV With {.Key = "K1", .Value = "V1"}, New KV With {.Key = "K2", .Value = "V2"}, New KV With {.Key = "K3", .Value = "V3"} }))
Withキーワードによるオブジェクト初期化子ってのがあるんだけど、プロパティ(フィールドへの代入)しかできなくってちょっと工夫がいるみたい。
実は、もっと奥の手があったりする?
完全なコードはこちら
Option Explicit On Option Strict On <TestClass()> _ Public Class DictionaryTest Private testContextInstance As TestContext <ClassInitialize()> _ Public Shared Sub MyClassInitialize(ByVal testContext As TestContext) testContext.Properties.Add("data1", createInstance(New List(Of KV)({ New KV With {.Key = "K1", .Value = "V1"}, New KV With {.Key = "K2", .Value = "V2"}, New KV With {.Key = "K3", .Value = "V3"} }))) End Sub <TestMethod()> _ Public Sub Dummy() End Sub Public Property TestContext() As TestContext Get Return testContextInstance End Get Set(ByVal value As TestContext) testContextInstance = value End Set End Property ' 以下ヘルパー Class KV Public Key As String Public Value As Object End Class Public Shared Function createInstance(ByVal kvps As IList(Of KV)) As Dictionary(Of String, Object) Dim dic As New Dictionary(Of String, Object) For Each kvp As KV In kvps dic.Add(kvp.Key, kvp.Value) Next Return dic End Function End Class
なーんてやってたら、親しいプロの.NETerに教えてもろたっス
' .Net Framework 4 前提だけど... Dim x = New Dictionary(Of Integer, String)() From {{10, "101"}, {20, "202"}} ' コレクション初期化子が導入されたらしい。
んで、最初のコードを書き直したのがコレ
Option Explicit On Option Strict On <TestClass()> _ Public Class DictionaryTest Private testContextInstance As TestContext <ClassInitialize()> _ Public Shared Sub MyClassInitialize(ByVal testContext As TestContext) testContext.Properties.Add("data1", New Dictionary(Of String, Object)() From { {"K1", "K2"}, {"V1", "V2"}, {"K3", "V3"} }) End Sub <TestMethod()> _ Public Sub Dummy() End Sub Public Property TestContext() As TestContext Get Return testContextInstance End Get Set(ByVal value As TestContext) testContextInstance = value End Set End Property End Class
うーん
スッキリ
Linq系ってことですなw