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