.NETで作る!

.NETに関するあれこれ(C#、VB.NET)

Private、Private Shared なFunctionをUnitTestする

VB.NET で Private Method、Private Shared Method を Unit Test します。

検証対象クラス

Public Class Sample
    Public Sub New(prefix As String)
        Me.Prefix = prefix
    End Sub

    Private Property Prefix As String

    Private Function AddPrefix(s As String) As String
        Return Me.Prefix & s
    End Function

    Private Shared Function ToLower(s As String) As String
        Return s.ToLower
    End Function
End Class

やってる処理に深い意味はないです。

AddPrefix(Private Method)の検証

リフレクション、またはPrivateObjectを使用します。*1

Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports System.Reflection

<TestClass()>
Public Class PrivateMethodTest

    <TestMethod()>
    Public Sub TestMethod_Refrection()
        Dim c As New Sample("pre")

        Dim fn = c.GetType.GetMethod("AddPrefix", BindingFlags.Instance Or BindingFlags.NonPublic)
        Dim actual = fn.Invoke(c, {"FIX"})

        Assert.AreEqual("preFIX", actual)
    End Sub

    <TestMethod()>
    Public Sub TestMethod_PrivateObject()
        Dim c As New Sample("pre")

        Dim pobj As New PrivateObject(c)
        Dim actual = pobj.Invoke("AddPrefix", {"FIX"})

        Assert.AreEqual("preFIX", actual)
    End Sub
End Class

PrivateObject の方が少しだけ使いやすいです。

ToLower(Private Shared Method)の検証

リフレクション、またはPrivateTypeを使用します。

Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports System.Reflection

<TestClass()>
Public Class PrivateSharedTest

    <TestMethod()>
    Public Sub TestMethod_Refrection()
        Dim fn = GetType(Sample).GetMethod("ToLower", BindingFlags.Static Or BindingFlags.NonPublic)
        Dim actual = fn.Invoke(Nothing, {"FIX"})

        Assert.AreEqual("fix", actual)
    End Sub

    <TestMethod()>
    Public Sub TestMethod_PrivateType()
        Dim ptype As New PrivateType(GetType(Sample))
        Dim actual = ptype.InvokeStatic("ToLower", {"FIX"})

        Assert.AreEqual("fix", actual)
    End Sub
End Class

PrivateType の方が少しだけ使いやすいです。

*1:リンク先にある Chainning Assertion は使いたかったのですが、VBでは「is not csharp code」が出て使用できないっぽいです。

. .