测试后行之CodeSmith模板
<%@ CodeTemplate Language="VB" TargetLanguage="Text" Description="Template description here." Debug="False" %>
<%@ Assembly Name="System.Design" %>
<%@ Import Namespace="System.Reflection" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Text" %>
<%@ Property Name="FullClassName" Type="System.String" Category="Template Options" Description="This is the fully qualified name of the class to test." %>
<%@ Property Name="IncludeInheritedMembers" Type="System.Boolean" Category="Template Options" Required="true" default="false" %>
<%@ Property Name="DeclaringTypeToExclude" Type="System.String" Category="Template Options" Required="false" %>
<%@ Property Name="GenerateConstructorClasses" Type="System.Boolean" Category="Constructor Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<%@ Property Name="GeneratePropertyClasses" Type="System.Boolean" Category="Property Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<%@ Property Name="GenerateMethodClasses" Type="System.Boolean" Category="Method Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<% InitTemplate() %>
Imports System
Imports NUnit.Framework
Imports <%= GetNamespaceOnly(FullClassName)%>
Namespace <%= GetTestNamespace(FullClassName) %>
<%'/*
'----------------------------------------------
'--------------- Constructors -----------------
'----------------------------------------------
'*/
If (GenerateConstructorClasses) Then
%>
#Region "Constructor Tests"
<TestFixture> _
public class ConstructorTesting
#Region "Test Preparation Methods"
#Region "TestFixture SetUp and TearDown"
<TestFixtureSetUp> _
Public Sub FixtureInit()
End Sub
<TestFixtureTearDown> _
public Sub FixtureDispose()
End Sub
#End Region
#Region "Test SetUp and TearDown"
<SetUp> _
public Sub TestInit()
End Sub
<TearDown> _
public Sub TestDispose()
End Sub
#End Region
#End Region
#Region "Test Methods"
<%Dim i As Integer%>
<%For i = 0 To constructors.Length - 1%>
<%If i = 0 Then%>
<%= CreateConstructorTest(GetClassName(FullClassName),constructors(i))%>
<%Else%>
<%= CreateConstructorTest(GetClassName(FullClassName) + "_Overload" + i.ToString(),constructors(i))%>
<%End iF%>
<%Next%>
#End Region
End Sub
#End Region
<%End If%>
<% If (GenerateMethodClasses) Then%>
<%'/*
'----------------------------------------------
'-------------- Static Methods ----------------
'----------------------------------------------
'*/%>
#Region Static Method Tests
<TestFixture> _
public class StaticMethodTesting
#Region "Test Preparation Methods"
#Region "TestFixture Setup and TearDown"
<TestFixtureSetUp> _
public Sub FixtureInit()
End Sub
<TestFixtureTearDown> _
public Sub FixtureDispose()
End Sub
#End Region
#Region "Test SetUp and TearDown"
<SetUp> _
public Sub TestInit()
End Sub
<TearDown> _
public Sub TestDispose()
End Sub
#End Region
#End Region
#Region Test Methods
<%Dim i As Integer%>
<% For i = 0 To methods.Length - 1
If (methods(i).IsStatic _
AndAlso (Not methods(i).Name.StartsWith("get_") _
AndAlso (Not methods(i).Name.StartsWith("set_") _
AndAlso ((methods(i).DeclaringType.ToString <> DeclaringTypeToExclude) _
AndAlso (methods(i).DeclaringType.ToString <> "System.Object"))))) Then%>
<%= CreateMethodTest(methods(i), staticMethodCount) %>
<%End iF%>
<%Next%>
#End Region
End Sub
#End Region
<%'/*
'----------------------------------------------
'------------------ Methods -------------------
'----------------------------------------------
'*/%>
#Region Method Tests
<TestFixture> _
public class MethodTesting
// Variable to hold object to be tested for reuse by init functions
<%= FullClassName %> m_<%= GetCamelCaseName(GetClassName(FullClassName)) %>;
#Region "Test Preparation Methods"
#Region "TestFixture SetUp and TearDown"
<TestFixtureSetUp> _
public Sub FixtureInit()
End Sub
<TestFixtureTearDown> _
public Sub FixtureDispose()
End Sub
#End Region
#Region "Test SetUp and TearDown"
<%= CreateMethodTestInit(FullClassName) %>
<%= CreateMethodTestDispose(GetClassName(FullClassName)) %>
#End Region
#End Region
#Region Test Methods
<% For i = 0 To properties.Length - 1
if (Not methods(i).IsStatic _
AndAlso (Not methods(i).Name.StartsWith("get_") _
AndAlso (Not methods(i).Name.StartsWith("set_") _
AndAlso ((methods(i).DeclaringType.ToString <> DeclaringTypeToExclude) _
AndAlso (methods(i).DeclaringType.ToString <> "System.Object"))))) Then%>
<%= CreateMethodTest(methods(i), instanceMethodCount) %>
<%End iF%>
<%Next%>
#End Region
End Class
#End Region
<%End If%>
<%If (GeneratePropertyClasses) Then%>
<%'/*
'----------------------------------------------
'----------------- Properties -----------------
'----------------------------------------------
'*/%>
#Region "Property Tests"
<TestFixture> _
public class PropertyTesting
// Variable to hold object to be tested for reuse by init functions
<%= FullClassName %> m_<%= GetCamelCaseName(GetClassName(FullClassName)) %>;
#Region Test Preparation Methods
#Region TestFixture SetUp and TearDown
<%= CreatePropertyTestFixtureInit(FullClassName) %>
<%= CreatePropertyTestFixtureDispose(GetClassName(FullClassName)) %>
#End Region
#Region Test SetUp and TearDown
<SetUp> _
public Sub TestInit()
End Sub
<TearDown> _
public Sub TestDispose()
End Sub
#End Region
#End Region
#Region Test Methods
<%Dim i As Integer%>
<% For i = 0 To properties.Length - 1
If (properties(i).DeclaringType.ToString() <> DeclaringTypeToExclude) Then%>
<%= CreatePropertyTest(properties(i))%>
<%End iF%>
<%Next%>
#End Region
End Sub
#End Region
<%End If%>
End Namespace
<script runat="template">
Dim constructors() As ConstructorInfo = Nothing
Dim methods() As MethodInfo = Nothing
Dim properties() As PropertyInfo = Nothing
Dim staticMethodCount As Hashtable = New Hashtable
Dim instanceMethodCount As Hashtable = New Hashtable
Dim instanceConstructorCount As Hashtable = New Hashtable
Private _assemblyPath As String
<Editor(GetType(System.Windows.Forms.Design.FileNameEditor), GetType(System.Drawing.Design.UITypeEditor)), _
CodeTemplateProperty(CodeTemplatePropertyOption.Required), _
Category("Template Options"), _
Description("This is the full path, including the assembly name, of the assembly which contains the class to test."& _
"")> _
Public Property AssemblyPath As String
Get
Return _assemblyPath
End Get
Set
_assemblyPath = value
End Set
End Property
Public Sub InitTemplate()
'Debugger.Break();
' Reflect object properties
constructors = ReflectClassConstructors(AssemblyPath, FullClassName)
methods = ReflectClassMethods(AssemblyPath, FullClassName)
properties = ReflectClassProperties(AssemblyPath, FullClassName)
End Sub
Public Function GetCamelCaseName(ByVal value As String) As String
Return (value.Substring(0, 1).ToLower + value.Substring(1))
End Function
Public Function GetCaseName(ByVal value As String) As String
Return (value.Substring(0, 1).ToUpper + value.Substring(1))
End Function
' Returns just the class name given a fully qualified class name; i.e. BHCS.Portal.McCoy.Engine.Entities.Module
Public Function GetClassName(ByVal fullClassName As String) As String
Return fullClassName.Substring((fullClassName.LastIndexOf(".") + 1))
End Function
Public Function GetNamespaceOnly(ByVal fullClassName As String) As String
Return fullClassName.Substring(0, fullClassName.LastIndexOf("."))
End Function
Public Function GetTestNamespace(ByVal fullClassName As String) As String
Return (GetNamespaceOnly(fullClassName) + (".Test." + GetClassName(fullClassName)))
End Function
Public Function CreateConstructorTestBody(ByVal constructor As ConstructorInfo) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("// Declare variables to pass to constructor call" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Set values for variables" & vbLf)
Dim parameters() As ParameterInfo = constructor.GetParameters
Dim c As Integer = 0
Do While (c < parameters.Length)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(parameters(c).ParameterType.ToString)
sb.Append(" _")
sb.Append(parameters(c).Name)
sb.Append(" = ")
sb.Append(GetTypeDefaultValue(parameters(c).ParameterType.ToString))
sb.Append(";" & vbLf)
c = (c + 1)
Loop
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Declare return type to hold constructor result" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(FullClassName)
sb.Append(" _returnValue;" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Instantiate object" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "_returnValue = new ")
sb.Append(FullClassName)
sb.Append("(")
Do While (c < parameters.Length)
sb.Append(" _")
sb.Append(parameters(c).Name)
sb.Append(", ")
c = (c + 1)
Loop
If (parameters.Length > 0) Then
sb.Remove((sb.Length - 2), 2)
End If
sb.Append(");" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Perform Assert Tests" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Write Assert Tests for object instance" & vbLf)
Return sb.ToString
End Function
' Creates the constructor test method
Public Function CreateConstructorTest(ByVal constructorName As String, ByVal constructor As ConstructorInfo) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("<Test, Ignore(\""Setup ")
sb.Append(FullClassName)
sb.Append(" parameter value and Assert tests for the constructor\"")> _" & vbLf)
sb.Append("" & vbTab & vbTab & "public Sub ")
sb.Append(constructorName)
sb.Append("()" & vbLf)
sb.Append("" & vbTab & vbTab & "" & vbLf & vbTab & vbTab & vbTab)
sb.Append(CreateConstructorTestBody(constructor))
sb.Append("" & vbLf & vbTab & vbTab & "End Sub")
Return sb.ToString
End Function
Public Function ReflectClassConstructors(ByVal assemblyPath As String, ByVal fullyQualifiedClassName As String) As ConstructorInfo()
' Retrieve the type of the class
Dim type As System.Type = GetClassType(assemblyPath, fullyQualifiedClassName)
' Return the list of properties
If IncludeInheritedMembers Then
Return type.GetConstructors((BindingFlags.Public Or BindingFlags.Instance))
Else
Return type.GetConstructors((BindingFlags.Public _
Or (BindingFlags.Instance Or BindingFlags.DeclaredOnly)))
End If
End Function
Public Function CreatePropertyTestFixtureInit(ByVal fullClassName As String) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("<TestFixtureSetUp> _" & vbLf)
sb.Append("" & vbTab & vbTab & "public Sub FixtureInit()" & vbLf)
sb.Append("" & vbTab & vbTab & "" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Initialize the ")
sb.Append(fullClassName)
sb.Append(" for the test suite with the desired constructor and variables" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append("m_")
sb.Append(GetCamelCaseName(GetClassName(fullClassName)))
sb.Append(" = new ")
sb.Append(fullClassName)
sb.Append("();" & vbLf)
sb.Append("" & vbTab & vbTab & "End Sub")
Return sb.ToString
End Function
Public Function CreatePropertyTestFixtureDispose(ByVal className As String) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("<TestFixtureTearDown> _" & vbLf)
sb.Append("" & vbTab & vbTab & "public Sub FixtureDispose()" & vbLf)
sb.Append("" & vbTab & vbTab & "" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "m_")
sb.Append(GetCamelCaseName(className))
sb.Append(" = null;" & vbLf)
sb.Append("" & vbTab & vbTab & "End Sub")
Return sb.ToString
End Function
' Create the body of the _property test
Public Function Create_propertyTestBody(ByVal _property As propertyInfo) As String
Dim sb As StringBuilder = New StringBuilder
If _property.CanRead Then
sb.Append("" & vbTab & vbTab & vbTab & "// Declare return variable to hold _property get method" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(_property.propertyType.ToString)
sb.Append(" _getValue = ")
sb.Append(GetTypeDefaultValue(_property.propertyType.ToString))
sb.Append(";" & vbLf)
sb.Append("" & vbLf & vbTab & vbTab & vbTab & "// Test get method" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "_getValue = ")
If _property.GetAccessors()(0).IsStatic Then
sb.Append(FullClassName)
Else
sb.Append("m_")
sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
End If
sb.Append(".")
sb.Append(_property.Name)
sb.Append(";" & vbLf)
End If
If _property.CanWrite Then
sb.Append("" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Declare variable to hold _property set method" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(_property.propertyType.ToString)
sb.Append(" _setValue = ")
sb.Append(GetTypeDefaultValue(_property.propertyType.ToString))
sb.Append(";" & vbLf)
sb.Append("" & vbLf & vbTab & vbTab & vbTab & "// Test set method" & vbLf)
If _property.GetAccessors()(0).IsStatic Then
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(FullClassName)
Else
sb.Append("" & vbTab & vbTab & vbTab & "m_")
sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
End If
sb.Append(".")
sb.Append(_property.Name)
sb.Append(" = _setValue")
sb.Append(";" & vbLf)
End If
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Perform Assert Tests" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Write Assert Tests for ")
sb.Append(_property.Name)
sb.Append("()" & vbLf)
Return sb.ToString
End Function
' Create the body of the _property test
Public Function CreatePropertyTestBody(ByVal _property As PropertyInfo) As String
Dim sb As StringBuilder = New StringBuilder
If _property.CanRead Then
sb.Append("" & vbTab & vbTab & vbTab & "// Declare return variable to hold _property get method" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(_property.PropertyType.ToString)
sb.Append(" _getValue = ")
sb.Append(GetTypeDefaultValue(_property.PropertyType.ToString))
sb.Append(";" & vbLf)
sb.Append("" & vbLf & vbTab & vbTab & vbTab & "// Test get method" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "_getValue = ")
If _property.GetAccessors()(0).IsStatic Then
sb.Append(FullClassName)
Else
sb.Append("m_")
sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
End If
sb.Append(".")
sb.Append(_property.Name)
sb.Append(";" & vbLf)
End If
If _property.CanWrite Then
sb.Append("" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Declare variable to hold _property set method" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(_property.PropertyType.ToString)
sb.Append(" _setValue = ")
sb.Append(GetTypeDefaultValue(_property.PropertyType.ToString))
sb.Append(";" & vbLf)
sb.Append("" & vbLf & vbTab & vbTab & vbTab & "// Test set method" & vbLf)
If _property.GetAccessors()(0).IsStatic Then
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(FullClassName)
Else
sb.Append("" & vbTab & vbTab & vbTab & "m_")
sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
End If
sb.Append(".")
sb.Append(_property.Name)
sb.Append(" = _setValue")
sb.Append(";" & vbLf)
End If
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Perform Assert Tests" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Write Assert Tests for ")
sb.Append(_property.Name)
sb.Append("()" & vbLf)
Return sb.ToString
End Function
' Creates the property test method
Public Function CreatePropertyTest(ByVal _property As PropertyInfo) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("<Test, Ignore(\""Setup ")
sb.Append("Assert tests for the property ")
sb.Append(GetCaseName(_property.Name))
sb.Append("\"")> _" & vbLf & vbTab & vbTab & "public Sub ")
sb.Append(GetCaseName(_property.Name))
sb.Append("()" & vbLf)
sb.Append("" & vbTab & vbTab & "" & vbLf)
sb.Append(CreatePropertyTestBody(_property))
sb.Append("" & vbTab & vbTab & "End Sub")
Return sb.ToString
End Function
Public Function ReflectClassProperties(ByVal assemblyPath As String, ByVal fullyQualifiedClassName As String) As PropertyInfo()
' Retrieve the type of the class
Dim type As System.Type = GetClassType(assemblyPath, fullyQualifiedClassName)
' Return the list of properties
If IncludeInheritedMembers Then
Return type.GetProperties((BindingFlags.Public _
Or (BindingFlags.Static Or BindingFlags.Instance)))
Else
Return type.GetProperties((BindingFlags.Public _
Or (BindingFlags.Static _
Or (BindingFlags.Instance Or BindingFlags.DeclaredOnly))))
End If
End Function
Public Function CreateMethodTestInit(ByVal fullClassName As String) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("<SetUp> _" & vbLf)
sb.Append("" & vbTab & vbTab & "public Sub TestInit()" & vbLf)
sb.Append("" & vbTab & vbTab & "" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Initialize the ")
sb.Append(fullClassName)
sb.Append(" for each test with the desired constructor and variables" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append("m_")
sb.Append(GetCamelCaseName(GetClassName(fullClassName)))
sb.Append(" = new ")
sb.Append(fullClassName)
sb.Append("();" & vbLf)
sb.Append("" & vbTab & vbTab & "End Sub")
Return sb.ToString
End Function
Public Function CreateMethodTestDispose(ByVal className As String) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("<TearDown> _" & vbLf)
sb.Append("" & vbTab & vbTab & "public Sub TestDispose()" & vbLf)
sb.Append("" & vbTab & vbTab & "" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "m_")
sb.Append(GetCamelCaseName(className))
sb.Append(" = null;" & vbLf)
sb.Append("" & vbTab & vbTab & "End Sub")
Return sb.ToString
End Function
Public Function CreateMethodTestBody(ByVal method As MethodInfo) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("" & vbTab & vbTab & vbTab & "// Declare variables to pass to method call" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Set values for variables" & vbLf)
Dim parameters() As ParameterInfo = method.GetParameters
Dim c As Integer = 0
Do While (c < parameters.Length)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(parameters(c).ParameterType.ToString)
sb.Append(" _")
sb.Append(parameters(c).Name)
sb.Append(" = ")
sb.Append(GetTypeDefaultValue(parameters(c).ParameterType.ToString))
sb.Append(";" & vbLf)
c = (c + 1)
Loop
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
If (method.ReturnType.ToString <> "System.Sub") Then
sb.Append("" & vbTab & vbTab & vbTab & "// Declare return type to hold method result" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(method.ReturnType.ToString)
sb.Append(" _returnValue;" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Make method call" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "_returnValue = ")
Else
sb.Append("" & vbTab & vbTab & vbTab & "// Make method call" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
End If
If method.IsStatic Then
sb.Append(FullClassName)
Else
sb.Append("m_")
sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
End If
sb.Append(".")
sb.Append(method.Name)
sb.Append("(")
Do While (c < parameters.Length)
sb.Append(" _")
sb.Append(parameters(c).Name)
sb.Append(", ")
c = (c + 1)
Loop
If (parameters.Length > 0) Then
sb.Remove((sb.Length - 2), 2)
End If
sb.Append(");" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Perform Assert Tests" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Write Assert Tests for ")
sb.Append(method.Name)
sb.Append("()" & vbLf)
Return sb.ToString
End Function
' Creates the method test method
Public Function CreateMethodTest(ByVal method As MethodInfo, ByVal methodCount As Hashtable) As String
Dim sb As StringBuilder = New StringBuilder
Dim currentOverloadCount As Integer = MethodOverloadCount(method.Name, methodCount)
sb.Append("<Test, Ignore(\""Setup ")
sb.Append(" parameter value(s) and Assert tests for the method ")
sb.Append(GetCaseName(method.Name))
sb.Append("\"")> _" & vbLf & vbTab & vbTab & "public Sub ")
sb.Append(GetCaseName(method.Name))
If (currentOverloadCount > 1) Then
sb.Append("_Overload")
sb.Append(currentOverloadCount.ToString)
End If
sb.Append("()" & vbLf)
sb.Append("" & vbTab & vbTab & "" & vbLf)
sb.Append(CreateMethodTestBody(method))
sb.Append("" & vbTab & vbTab & "End Sub")
Return sb.ToString
End Function
' Returns the current number of overloads for a given method name
Public Function MethodOverloadCount(ByVal methodName As String, ByVal methodCount As Hashtable) As Integer
Dim currentCount As Integer = 0
If methodCount.ContainsKey(methodName) Then
currentCount = CType(methodCount(methodName),Integer)
End If
Dim i As Integer = 0
For i = 0 To methods.Length - 1
If (methods(i).Name = methodName) Then
currentCount = (currentCount + 1)
If methodCount.ContainsKey(methodName) Then
If (currentCount > CType(methodCount(methodName),Integer)) Then
methodCount(methodName) = (CType(methodCount(methodName),Integer) + 1)
End If
Else
methodCount.Add(methodName, 1)
End If
If (currentCount = CType(methodCount(methodName),Integer)) Then
Exit For
End If
End If
Next
Return CType(methodCount(methodName),Integer)
End Function
Public Function ReflectClassMethods(ByVal assemblyPath As String, ByVal fullyQualifiedClassName As String) As MethodInfo()
' Retrieve the type of the class
Dim type As System.Type = GetClassType(assemblyPath, fullyQualifiedClassName)
' Return the list of properties
If IncludeInheritedMembers Then
Return type.GetMethods((BindingFlags.Public _
Or (BindingFlags.Static Or BindingFlags.Instance)))
Else
Return type.GetMethods((BindingFlags.Public _
Or (BindingFlags.Static _
Or (BindingFlags.Instance Or BindingFlags.DeclaredOnly))))
End If
End Function
Public Function GetClassType(ByVal assemblyPath As String, ByVal fullyQualifiedClassName As String) As System.Type
' Load the assembly which contains the class to reflect
Dim assembly As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(assemblyPath)
' Retrieve the type of the class
Dim type As System.Type = assembly.GetType(fullyQualifiedClassName)
' Release the assembly
assembly = Nothing
Return type
End Function
Public Function GetTypeDefaultValue(ByVal typeName As String) As String
' init the variable value
Dim variableValue As String = string.Empty
' determine the default variable value from the variable type
Select Case (typeName)
Case "System.Binary", "System.Byte", "System.Int16", "System.Int32", "System.Int64"
variableValue = "0"
Exit Select
Case "System.String"
variableValue = "String.Empty"
Exit Select
Case "System.Boolean"
variableValue = "false"
Exit Select
Case "System.Guid"
variableValue = "Guid.NewGuid()"
Exit Select
Case "System.DateTime"
variableValue = "DateTime.MinValue"
Exit Select
Case Else
variableValue = "null"
Exit Select
End Select
Return variableValue
End Function
</script>
<%@ Assembly Name="System.Design" %>
<%@ Import Namespace="System.Reflection" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Text" %>
<%@ Property Name="FullClassName" Type="System.String" Category="Template Options" Description="This is the fully qualified name of the class to test." %>
<%@ Property Name="IncludeInheritedMembers" Type="System.Boolean" Category="Template Options" Required="true" default="false" %>
<%@ Property Name="DeclaringTypeToExclude" Type="System.String" Category="Template Options" Required="false" %>
<%@ Property Name="GenerateConstructorClasses" Type="System.Boolean" Category="Constructor Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<%@ Property Name="GeneratePropertyClasses" Type="System.Boolean" Category="Property Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<%@ Property Name="GenerateMethodClasses" Type="System.Boolean" Category="Method Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<% InitTemplate() %>
Imports System
Imports NUnit.Framework
Imports <%= GetNamespaceOnly(FullClassName)%>
Namespace <%= GetTestNamespace(FullClassName) %>
<%'/*
'----------------------------------------------
'--------------- Constructors -----------------
'----------------------------------------------
'*/
If (GenerateConstructorClasses) Then
%>
#Region "Constructor Tests"
<TestFixture> _
public class ConstructorTesting
#Region "Test Preparation Methods"
#Region "TestFixture SetUp and TearDown"
<TestFixtureSetUp> _
Public Sub FixtureInit()
End Sub
<TestFixtureTearDown> _
public Sub FixtureDispose()
End Sub
#End Region
#Region "Test SetUp and TearDown"
<SetUp> _
public Sub TestInit()
End Sub
<TearDown> _
public Sub TestDispose()
End Sub
#End Region
#End Region
#Region "Test Methods"
<%Dim i As Integer%>
<%For i = 0 To constructors.Length - 1%>
<%If i = 0 Then%>
<%= CreateConstructorTest(GetClassName(FullClassName),constructors(i))%>
<%Else%>
<%= CreateConstructorTest(GetClassName(FullClassName) + "_Overload" + i.ToString(),constructors(i))%>
<%End iF%>
<%Next%>
#End Region
End Sub
#End Region
<%End If%>
<% If (GenerateMethodClasses) Then%>
<%'/*
'----------------------------------------------
'-------------- Static Methods ----------------
'----------------------------------------------
'*/%>
#Region Static Method Tests
<TestFixture> _
public class StaticMethodTesting
#Region "Test Preparation Methods"
#Region "TestFixture Setup and TearDown"
<TestFixtureSetUp> _
public Sub FixtureInit()
End Sub
<TestFixtureTearDown> _
public Sub FixtureDispose()
End Sub
#End Region
#Region "Test SetUp and TearDown"
<SetUp> _
public Sub TestInit()
End Sub
<TearDown> _
public Sub TestDispose()
End Sub
#End Region
#End Region
#Region Test Methods
<%Dim i As Integer%>
<% For i = 0 To methods.Length - 1
If (methods(i).IsStatic _
AndAlso (Not methods(i).Name.StartsWith("get_") _
AndAlso (Not methods(i).Name.StartsWith("set_") _
AndAlso ((methods(i).DeclaringType.ToString <> DeclaringTypeToExclude) _
AndAlso (methods(i).DeclaringType.ToString <> "System.Object"))))) Then%>
<%= CreateMethodTest(methods(i), staticMethodCount) %>
<%End iF%>
<%Next%>
#End Region
End Sub
#End Region
<%'/*
'----------------------------------------------
'------------------ Methods -------------------
'----------------------------------------------
'*/%>
#Region Method Tests
<TestFixture> _
public class MethodTesting
// Variable to hold object to be tested for reuse by init functions
<%= FullClassName %> m_<%= GetCamelCaseName(GetClassName(FullClassName)) %>;
#Region "Test Preparation Methods"
#Region "TestFixture SetUp and TearDown"
<TestFixtureSetUp> _
public Sub FixtureInit()
End Sub
<TestFixtureTearDown> _
public Sub FixtureDispose()
End Sub
#End Region
#Region "Test SetUp and TearDown"
<%= CreateMethodTestInit(FullClassName) %>
<%= CreateMethodTestDispose(GetClassName(FullClassName)) %>
#End Region
#End Region
#Region Test Methods
<% For i = 0 To properties.Length - 1
if (Not methods(i).IsStatic _
AndAlso (Not methods(i).Name.StartsWith("get_") _
AndAlso (Not methods(i).Name.StartsWith("set_") _
AndAlso ((methods(i).DeclaringType.ToString <> DeclaringTypeToExclude) _
AndAlso (methods(i).DeclaringType.ToString <> "System.Object"))))) Then%>
<%= CreateMethodTest(methods(i), instanceMethodCount) %>
<%End iF%>
<%Next%>
#End Region
End Class
#End Region
<%End If%>
<%If (GeneratePropertyClasses) Then%>
<%'/*
'----------------------------------------------
'----------------- Properties -----------------
'----------------------------------------------
'*/%>
#Region "Property Tests"
<TestFixture> _
public class PropertyTesting
// Variable to hold object to be tested for reuse by init functions
<%= FullClassName %> m_<%= GetCamelCaseName(GetClassName(FullClassName)) %>;
#Region Test Preparation Methods
#Region TestFixture SetUp and TearDown
<%= CreatePropertyTestFixtureInit(FullClassName) %>
<%= CreatePropertyTestFixtureDispose(GetClassName(FullClassName)) %>
#End Region
#Region Test SetUp and TearDown
<SetUp> _
public Sub TestInit()
End Sub
<TearDown> _
public Sub TestDispose()
End Sub
#End Region
#End Region
#Region Test Methods
<%Dim i As Integer%>
<% For i = 0 To properties.Length - 1
If (properties(i).DeclaringType.ToString() <> DeclaringTypeToExclude) Then%>
<%= CreatePropertyTest(properties(i))%>
<%End iF%>
<%Next%>
#End Region
End Sub
#End Region
<%End If%>
End Namespace
<script runat="template">
Dim constructors() As ConstructorInfo = Nothing
Dim methods() As MethodInfo = Nothing
Dim properties() As PropertyInfo = Nothing
Dim staticMethodCount As Hashtable = New Hashtable
Dim instanceMethodCount As Hashtable = New Hashtable
Dim instanceConstructorCount As Hashtable = New Hashtable
Private _assemblyPath As String
<Editor(GetType(System.Windows.Forms.Design.FileNameEditor), GetType(System.Drawing.Design.UITypeEditor)), _
CodeTemplateProperty(CodeTemplatePropertyOption.Required), _
Category("Template Options"), _
Description("This is the full path, including the assembly name, of the assembly which contains the class to test."& _
"")> _
Public Property AssemblyPath As String
Get
Return _assemblyPath
End Get
Set
_assemblyPath = value
End Set
End Property
Public Sub InitTemplate()
'Debugger.Break();
' Reflect object properties
constructors = ReflectClassConstructors(AssemblyPath, FullClassName)
methods = ReflectClassMethods(AssemblyPath, FullClassName)
properties = ReflectClassProperties(AssemblyPath, FullClassName)
End Sub
Public Function GetCamelCaseName(ByVal value As String) As String
Return (value.Substring(0, 1).ToLower + value.Substring(1))
End Function
Public Function GetCaseName(ByVal value As String) As String
Return (value.Substring(0, 1).ToUpper + value.Substring(1))
End Function
' Returns just the class name given a fully qualified class name; i.e. BHCS.Portal.McCoy.Engine.Entities.Module
Public Function GetClassName(ByVal fullClassName As String) As String
Return fullClassName.Substring((fullClassName.LastIndexOf(".") + 1))
End Function
Public Function GetNamespaceOnly(ByVal fullClassName As String) As String
Return fullClassName.Substring(0, fullClassName.LastIndexOf("."))
End Function
Public Function GetTestNamespace(ByVal fullClassName As String) As String
Return (GetNamespaceOnly(fullClassName) + (".Test." + GetClassName(fullClassName)))
End Function
Public Function CreateConstructorTestBody(ByVal constructor As ConstructorInfo) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("// Declare variables to pass to constructor call" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Set values for variables" & vbLf)
Dim parameters() As ParameterInfo = constructor.GetParameters
Dim c As Integer = 0
Do While (c < parameters.Length)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(parameters(c).ParameterType.ToString)
sb.Append(" _")
sb.Append(parameters(c).Name)
sb.Append(" = ")
sb.Append(GetTypeDefaultValue(parameters(c).ParameterType.ToString))
sb.Append(";" & vbLf)
c = (c + 1)
Loop
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Declare return type to hold constructor result" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(FullClassName)
sb.Append(" _returnValue;" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Instantiate object" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "_returnValue = new ")
sb.Append(FullClassName)
sb.Append("(")
Do While (c < parameters.Length)
sb.Append(" _")
sb.Append(parameters(c).Name)
sb.Append(", ")
c = (c + 1)
Loop
If (parameters.Length > 0) Then
sb.Remove((sb.Length - 2), 2)
End If
sb.Append(");" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Perform Assert Tests" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Write Assert Tests for object instance" & vbLf)
Return sb.ToString
End Function
' Creates the constructor test method
Public Function CreateConstructorTest(ByVal constructorName As String, ByVal constructor As ConstructorInfo) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("<Test, Ignore(\""Setup ")
sb.Append(FullClassName)
sb.Append(" parameter value and Assert tests for the constructor\"")> _" & vbLf)
sb.Append("" & vbTab & vbTab & "public Sub ")
sb.Append(constructorName)
sb.Append("()" & vbLf)
sb.Append("" & vbTab & vbTab & "" & vbLf & vbTab & vbTab & vbTab)
sb.Append(CreateConstructorTestBody(constructor))
sb.Append("" & vbLf & vbTab & vbTab & "End Sub")
Return sb.ToString
End Function
Public Function ReflectClassConstructors(ByVal assemblyPath As String, ByVal fullyQualifiedClassName As String) As ConstructorInfo()
' Retrieve the type of the class
Dim type As System.Type = GetClassType(assemblyPath, fullyQualifiedClassName)
' Return the list of properties
If IncludeInheritedMembers Then
Return type.GetConstructors((BindingFlags.Public Or BindingFlags.Instance))
Else
Return type.GetConstructors((BindingFlags.Public _
Or (BindingFlags.Instance Or BindingFlags.DeclaredOnly)))
End If
End Function
Public Function CreatePropertyTestFixtureInit(ByVal fullClassName As String) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("<TestFixtureSetUp> _" & vbLf)
sb.Append("" & vbTab & vbTab & "public Sub FixtureInit()" & vbLf)
sb.Append("" & vbTab & vbTab & "" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Initialize the ")
sb.Append(fullClassName)
sb.Append(" for the test suite with the desired constructor and variables" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append("m_")
sb.Append(GetCamelCaseName(GetClassName(fullClassName)))
sb.Append(" = new ")
sb.Append(fullClassName)
sb.Append("();" & vbLf)
sb.Append("" & vbTab & vbTab & "End Sub")
Return sb.ToString
End Function
Public Function CreatePropertyTestFixtureDispose(ByVal className As String) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("<TestFixtureTearDown> _" & vbLf)
sb.Append("" & vbTab & vbTab & "public Sub FixtureDispose()" & vbLf)
sb.Append("" & vbTab & vbTab & "" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "m_")
sb.Append(GetCamelCaseName(className))
sb.Append(" = null;" & vbLf)
sb.Append("" & vbTab & vbTab & "End Sub")
Return sb.ToString
End Function
' Create the body of the _property test
Public Function Create_propertyTestBody(ByVal _property As propertyInfo) As String
Dim sb As StringBuilder = New StringBuilder
If _property.CanRead Then
sb.Append("" & vbTab & vbTab & vbTab & "// Declare return variable to hold _property get method" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(_property.propertyType.ToString)
sb.Append(" _getValue = ")
sb.Append(GetTypeDefaultValue(_property.propertyType.ToString))
sb.Append(";" & vbLf)
sb.Append("" & vbLf & vbTab & vbTab & vbTab & "// Test get method" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "_getValue = ")
If _property.GetAccessors()(0).IsStatic Then
sb.Append(FullClassName)
Else
sb.Append("m_")
sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
End If
sb.Append(".")
sb.Append(_property.Name)
sb.Append(";" & vbLf)
End If
If _property.CanWrite Then
sb.Append("" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Declare variable to hold _property set method" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(_property.propertyType.ToString)
sb.Append(" _setValue = ")
sb.Append(GetTypeDefaultValue(_property.propertyType.ToString))
sb.Append(";" & vbLf)
sb.Append("" & vbLf & vbTab & vbTab & vbTab & "// Test set method" & vbLf)
If _property.GetAccessors()(0).IsStatic Then
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(FullClassName)
Else
sb.Append("" & vbTab & vbTab & vbTab & "m_")
sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
End If
sb.Append(".")
sb.Append(_property.Name)
sb.Append(" = _setValue")
sb.Append(";" & vbLf)
End If
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Perform Assert Tests" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Write Assert Tests for ")
sb.Append(_property.Name)
sb.Append("()" & vbLf)
Return sb.ToString
End Function
' Create the body of the _property test
Public Function CreatePropertyTestBody(ByVal _property As PropertyInfo) As String
Dim sb As StringBuilder = New StringBuilder
If _property.CanRead Then
sb.Append("" & vbTab & vbTab & vbTab & "// Declare return variable to hold _property get method" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(_property.PropertyType.ToString)
sb.Append(" _getValue = ")
sb.Append(GetTypeDefaultValue(_property.PropertyType.ToString))
sb.Append(";" & vbLf)
sb.Append("" & vbLf & vbTab & vbTab & vbTab & "// Test get method" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "_getValue = ")
If _property.GetAccessors()(0).IsStatic Then
sb.Append(FullClassName)
Else
sb.Append("m_")
sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
End If
sb.Append(".")
sb.Append(_property.Name)
sb.Append(";" & vbLf)
End If
If _property.CanWrite Then
sb.Append("" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Declare variable to hold _property set method" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(_property.PropertyType.ToString)
sb.Append(" _setValue = ")
sb.Append(GetTypeDefaultValue(_property.PropertyType.ToString))
sb.Append(";" & vbLf)
sb.Append("" & vbLf & vbTab & vbTab & vbTab & "// Test set method" & vbLf)
If _property.GetAccessors()(0).IsStatic Then
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(FullClassName)
Else
sb.Append("" & vbTab & vbTab & vbTab & "m_")
sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
End If
sb.Append(".")
sb.Append(_property.Name)
sb.Append(" = _setValue")
sb.Append(";" & vbLf)
End If
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Perform Assert Tests" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Write Assert Tests for ")
sb.Append(_property.Name)
sb.Append("()" & vbLf)
Return sb.ToString
End Function
' Creates the property test method
Public Function CreatePropertyTest(ByVal _property As PropertyInfo) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("<Test, Ignore(\""Setup ")
sb.Append("Assert tests for the property ")
sb.Append(GetCaseName(_property.Name))
sb.Append("\"")> _" & vbLf & vbTab & vbTab & "public Sub ")
sb.Append(GetCaseName(_property.Name))
sb.Append("()" & vbLf)
sb.Append("" & vbTab & vbTab & "" & vbLf)
sb.Append(CreatePropertyTestBody(_property))
sb.Append("" & vbTab & vbTab & "End Sub")
Return sb.ToString
End Function
Public Function ReflectClassProperties(ByVal assemblyPath As String, ByVal fullyQualifiedClassName As String) As PropertyInfo()
' Retrieve the type of the class
Dim type As System.Type = GetClassType(assemblyPath, fullyQualifiedClassName)
' Return the list of properties
If IncludeInheritedMembers Then
Return type.GetProperties((BindingFlags.Public _
Or (BindingFlags.Static Or BindingFlags.Instance)))
Else
Return type.GetProperties((BindingFlags.Public _
Or (BindingFlags.Static _
Or (BindingFlags.Instance Or BindingFlags.DeclaredOnly))))
End If
End Function
Public Function CreateMethodTestInit(ByVal fullClassName As String) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("<SetUp> _" & vbLf)
sb.Append("" & vbTab & vbTab & "public Sub TestInit()" & vbLf)
sb.Append("" & vbTab & vbTab & "" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Initialize the ")
sb.Append(fullClassName)
sb.Append(" for each test with the desired constructor and variables" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append("m_")
sb.Append(GetCamelCaseName(GetClassName(fullClassName)))
sb.Append(" = new ")
sb.Append(fullClassName)
sb.Append("();" & vbLf)
sb.Append("" & vbTab & vbTab & "End Sub")
Return sb.ToString
End Function
Public Function CreateMethodTestDispose(ByVal className As String) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("<TearDown> _" & vbLf)
sb.Append("" & vbTab & vbTab & "public Sub TestDispose()" & vbLf)
sb.Append("" & vbTab & vbTab & "" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "m_")
sb.Append(GetCamelCaseName(className))
sb.Append(" = null;" & vbLf)
sb.Append("" & vbTab & vbTab & "End Sub")
Return sb.ToString
End Function
Public Function CreateMethodTestBody(ByVal method As MethodInfo) As String
Dim sb As StringBuilder = New StringBuilder
sb.Append("" & vbTab & vbTab & vbTab & "// Declare variables to pass to method call" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Set values for variables" & vbLf)
Dim parameters() As ParameterInfo = method.GetParameters
Dim c As Integer = 0
Do While (c < parameters.Length)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(parameters(c).ParameterType.ToString)
sb.Append(" _")
sb.Append(parameters(c).Name)
sb.Append(" = ")
sb.Append(GetTypeDefaultValue(parameters(c).ParameterType.ToString))
sb.Append(";" & vbLf)
c = (c + 1)
Loop
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
If (method.ReturnType.ToString <> "System.Sub") Then
sb.Append("" & vbTab & vbTab & vbTab & "// Declare return type to hold method result" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
sb.Append(method.ReturnType.ToString)
sb.Append(" _returnValue;" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Make method call" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "_returnValue = ")
Else
sb.Append("" & vbTab & vbTab & vbTab & "// Make method call" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab)
End If
If method.IsStatic Then
sb.Append(FullClassName)
Else
sb.Append("m_")
sb.Append(GetCamelCaseName(GetClassName(FullClassName)))
End If
sb.Append(".")
sb.Append(method.Name)
sb.Append("(")
Do While (c < parameters.Length)
sb.Append(" _")
sb.Append(parameters(c).Name)
sb.Append(", ")
c = (c + 1)
Loop
If (parameters.Length > 0) Then
sb.Remove((sb.Length - 2), 2)
End If
sb.Append(");" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "// Perform Assert Tests" & vbLf)
sb.Append("" & vbTab & vbTab & vbTab & "//TODO: Write Assert Tests for ")
sb.Append(method.Name)
sb.Append("()" & vbLf)
Return sb.ToString
End Function
' Creates the method test method
Public Function CreateMethodTest(ByVal method As MethodInfo, ByVal methodCount As Hashtable) As String
Dim sb As StringBuilder = New StringBuilder
Dim currentOverloadCount As Integer = MethodOverloadCount(method.Name, methodCount)
sb.Append("<Test, Ignore(\""Setup ")
sb.Append(" parameter value(s) and Assert tests for the method ")
sb.Append(GetCaseName(method.Name))
sb.Append("\"")> _" & vbLf & vbTab & vbTab & "public Sub ")
sb.Append(GetCaseName(method.Name))
If (currentOverloadCount > 1) Then
sb.Append("_Overload")
sb.Append(currentOverloadCount.ToString)
End If
sb.Append("()" & vbLf)
sb.Append("" & vbTab & vbTab & "" & vbLf)
sb.Append(CreateMethodTestBody(method))
sb.Append("" & vbTab & vbTab & "End Sub")
Return sb.ToString
End Function
' Returns the current number of overloads for a given method name
Public Function MethodOverloadCount(ByVal methodName As String, ByVal methodCount As Hashtable) As Integer
Dim currentCount As Integer = 0
If methodCount.ContainsKey(methodName) Then
currentCount = CType(methodCount(methodName),Integer)
End If
Dim i As Integer = 0
For i = 0 To methods.Length - 1
If (methods(i).Name = methodName) Then
currentCount = (currentCount + 1)
If methodCount.ContainsKey(methodName) Then
If (currentCount > CType(methodCount(methodName),Integer)) Then
methodCount(methodName) = (CType(methodCount(methodName),Integer) + 1)
End If
Else
methodCount.Add(methodName, 1)
End If
If (currentCount = CType(methodCount(methodName),Integer)) Then
Exit For
End If
End If
Next
Return CType(methodCount(methodName),Integer)
End Function
Public Function ReflectClassMethods(ByVal assemblyPath As String, ByVal fullyQualifiedClassName As String) As MethodInfo()
' Retrieve the type of the class
Dim type As System.Type = GetClassType(assemblyPath, fullyQualifiedClassName)
' Return the list of properties
If IncludeInheritedMembers Then
Return type.GetMethods((BindingFlags.Public _
Or (BindingFlags.Static Or BindingFlags.Instance)))
Else
Return type.GetMethods((BindingFlags.Public _
Or (BindingFlags.Static _
Or (BindingFlags.Instance Or BindingFlags.DeclaredOnly))))
End If
End Function
Public Function GetClassType(ByVal assemblyPath As String, ByVal fullyQualifiedClassName As String) As System.Type
' Load the assembly which contains the class to reflect
Dim assembly As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(assemblyPath)
' Retrieve the type of the class
Dim type As System.Type = assembly.GetType(fullyQualifiedClassName)
' Release the assembly
assembly = Nothing
Return type
End Function
Public Function GetTypeDefaultValue(ByVal typeName As String) As String
' init the variable value
Dim variableValue As String = string.Empty
' determine the default variable value from the variable type
Select Case (typeName)
Case "System.Binary", "System.Byte", "System.Int16", "System.Int32", "System.Int64"
variableValue = "0"
Exit Select
Case "System.String"
variableValue = "String.Empty"
Exit Select
Case "System.Boolean"
variableValue = "false"
Exit Select
Case "System.Guid"
variableValue = "Guid.NewGuid()"
Exit Select
Case "System.DateTime"
variableValue = "DateTime.MinValue"
Exit Select
Case Else
variableValue = "null"
Exit Select
End Select
Return variableValue
End Function
</script>
C#版
<%@ CodeTemplate Language="C#" TargetLanguage="Text" Description="Template description here." Debug="False" %>
<%@ Assembly Name="System.Design" %>
<%@ Import Namespace="System.Reflection" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Text" %>
<%@ Property Name="FullClassName" Type="System.String" Category="Template Options" Description="This is the fully qualified name of the class to test." %>
<%@ Property Name="IncludeInheritedMembers" Type="System.Boolean" Category="Template Options" Required="true" default="false" %>
<%@ Property Name="DeclaringTypeToExclude" Type="System.String" Category="Template Options" Required="false" %>
<%@ Property Name="GenerateConstructorClasses" Type="System.Boolean" Category="Constructor Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<%@ Property Name="GeneratePropertyClasses" Type="System.Boolean" Category="Property Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<%@ Property Name="GenerateMethodClasses" Type="System.Boolean" Category="Method Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<% InitTemplate(); %>
using System;
using NUnit.Framework;
using <%= GetNamespaceOnly(FullClassName)%>;
namespace <%= GetTestNamespace(FullClassName) %>
{
<%/*
----------------------------------------------
--------------- Constructors -----------------
----------------------------------------------
*/
if(GenerateConstructorClasses){
%>
#region Constructor Tests
[TestFixture]
public class ConstructorTesting
{
#region Test Preparation Methods
#region TestFixture SetUp and TearDown
[TestFixtureSetUp]
public void FixtureInit()
{
}
[TestFixtureTearDown]
public void FixtureDispose()
{
}
#endregion
#region Test SetUp and TearDown
[SetUp]
public void TestInit()
{
}
[TearDown]
public void TestDispose()
{
}
#endregion
#endregion
#region Test Methods
<% for(int i = 0; i < constructors.Length; i++){ %>
<% if( i == 0) {%>
<%= CreateConstructorTest(GetClassName(FullClassName),constructors[i])%>
<%}else{%>
<%= CreateConstructorTest(GetClassName(FullClassName) + "_Overload" + i.ToString(),constructors[i])%>
<%}}%>
#endregion
}
#endregion
<%}%>
<% if(GenerateMethodClasses) {%>
<%/*
----------------------------------------------
-------------- Static Methods ----------------
----------------------------------------------
*/%>
#region Static Method Tests
[TestFixture]
public class StaticMethodTesting
{
#region Test Preparation Methods
#region TestFixture Setup and TearDown
[TestFixtureSetUp]
public void FixtureInit()
{
}
[TestFixtureTearDown]
public void FixtureDispose()
{
}
#endregion
#region Test SetUp and TearDown
[SetUp]
public void TestInit()
{
}
[TearDown]
public void TestDispose()
{
}
#endregion
#endregion
#region Test Methods
<% for(int i = 0; i < methods.Length; i++){
if(methods[i].IsStatic && !methods[i].Name.StartsWith("get_") && !methods[i].Name.StartsWith("set_") && methods[i].DeclaringType.ToString() != DeclaringTypeToExclude && methods[i].DeclaringType.ToString() != "System.Object"){%>
<%= CreateMethodTest(methods[i], staticMethodCount) %>
<%}}%>
#endregion
}
#endregion
<%/*
----------------------------------------------
------------------ Methods -------------------
----------------------------------------------
*/%>
#region Method Tests
[TestFixture]
public class MethodTesting
{
// Variable to hold object to be tested for reuse by init functions
<%= FullClassName %> m_<%= GetCamelCaseName(GetClassName(FullClassName)) %>;
#region Test Preparation Methods
#region TestFixture SetUp and TearDown
[TestFixtureSetUp]
public void FixtureInit()
{
}
[TestFixtureTearDown]
public void FixtureDispose()
{
}
#endregion
#region Test SetUp and TearDown
<%= CreateMethodTestInit(FullClassName) %>
<%= CreateMethodTestDispose(GetClassName(FullClassName)) %>
#endregion
#endregion
#region Test Methods
<% for(int i = 0; i < methods.Length; i++){
if(!methods[i].IsStatic && !methods[i].Name.StartsWith("get_") && !methods[i].Name.StartsWith("set_") && methods[i].DeclaringType.ToString() != DeclaringTypeToExclude && methods[i].DeclaringType.ToString() != "System.Object"){%>
<%= CreateMethodTest(methods[i], instanceMethodCount) %>
<%}}%>
#endregion
}
#endregion
<%}%>
<% if(GeneratePropertyClasses) {%>
<%/*
----------------------------------------------
----------------- Properties -----------------
----------------------------------------------
*/%>
#region Property Tests
[TestFixture]
public class PropertyTesting
{
// Variable to hold object to be tested for reuse by init functions
<%= FullClassName %> m_<%= GetCamelCaseName(GetClassName(FullClassName)) %>;
#region Test Preparation Methods
#region TestFixture SetUp and TearDown
<%= CreatePropertyTestFixtureInit(FullClassName) %>
<%= CreatePropertyTestFixtureDispose(GetClassName(FullClassName)) %>
#endregion
#region Test SetUp and TearDown
[SetUp]
public void TestInit()
{
}
[TearDown]
public void TestDispose()
{
}
#endregion
#endregion
#region Test Methods
<% for(int i = 0; i < properties.Length; i++){
if(properties[i].DeclaringType.ToString() != DeclaringTypeToExclude){%>
<%= CreatePropertyTest(properties[i])%>
<%}}%>
#endregion
}
#endregion
<%}%>
}
<script runat="template">
ConstructorInfo[] constructors = null;
MethodInfo[] methods = null;
PropertyInfo[] properties = null;
// Hashtables used to identify overloads for methods and constructors
Hashtable staticMethodCount = new Hashtable();
Hashtable instanceMethodCount = new Hashtable();
Hashtable instanceConstructorCount = new Hashtable();
[Editor(typeof(System.Windows.Forms.Design.FileNameEditor), typeof(System.Drawing.Design.UITypeEditor))]
[CodeTemplateProperty(CodeTemplatePropertyOption.Required)]
[Category("Template Options")]
[Description("This is the full path, including the assembly name, of the assembly which contains the class to test.")]
public string AssemblyPath
{
get { return assemblyPath; }
set { assemblyPath = value; }
}
private string assemblyPath;
public void InitTemplate()
{
//Debugger.Break();
// Reflect object properties
constructors = ReflectClassConstructors(AssemblyPath, FullClassName);
methods = ReflectClassMethods(AssemblyPath, FullClassName);
properties = ReflectClassProperties(AssemblyPath, FullClassName);
}
public string GetCamelCaseName(string value)
{
return value.Substring(0, 1).ToLower() + value.Substring(1);
}
public string GetCaseName(string value)
{
return value.Substring(0, 1).ToUpper() + value.Substring(1);
}
// Returns just the class name given a fully qualified class name; i.e. BHCS.Portal.McCoy.Engine.Entities.Module
public string GetClassName(string fullClassName)
{
return fullClassName.Substring(fullClassName.LastIndexOf(".") + 1);
}
public string GetNamespaceOnly(string fullClassName)
{
return fullClassName.Substring(0,fullClassName.LastIndexOf("."));
}
public string GetTestNamespace(string fullClassName)
{
return GetNamespaceOnly(fullClassName) + ".Test." + GetClassName(fullClassName);
}
public string CreateConstructorTestBody(ConstructorInfo constructor)
{
StringBuilder sb = new StringBuilder();
sb.Append("// Declare variables to pass to constructor call\n");
sb.Append("\t\t\t//TODO: Set values for variables\n");
ParameterInfo[] parameters = constructor.GetParameters();
for(int c = 0; c < parameters.Length; c++)
{
sb.Append("\t\t\t");
sb.Append(parameters[c].ParameterType.ToString());
sb.Append(" _");
sb.Append(parameters[c].Name);
sb.Append(" = ");
sb.Append(GetTypeDefaultValue(parameters[c].ParameterType.ToString()));
sb.Append(";\n");
}
sb.Append("\t\t\t\n");
sb.Append("\t\t\t// Declare return type to hold constructor result\n");
sb.Append("\t\t\t");
sb.Append(FullClassName);
sb.Append(" _returnValue;\n");
sb.Append("\t\t\t\n");
sb.Append("\t\t\t// Instantiate object\n");
sb.Append("\t\t\t_returnValue = new ");
sb.Append(FullClassName);
sb.Append("(");
for(int c = 0; c < parameters.Length; c++)
{
sb.Append(" _");
sb.Append(parameters[c].Name);
sb.Append(", ");
}
if(parameters.Length > 0)
sb.Remove(sb.Length -2 ,2);
sb.Append(");\n");
sb.Append("\t\t\t\n");
sb.Append("\t\t\t// Perform Assert Tests\n");
sb.Append("\t\t\t//TODO: Write Assert Tests for object instance\n");
return sb.ToString();
}
// Creates the constructor test method
public string CreateConstructorTest(string constructorName, ConstructorInfo constructor)
{
StringBuilder sb = new StringBuilder();
sb.Append("[Test, Ignore(\"Setup ");
sb.Append(FullClassName);
sb.Append(" parameter value and Assert tests for the constructor\")]\n");
sb.Append("\t\tpublic void ");
sb.Append(constructorName);
sb.Append("()\n");
sb.Append("\t\t{\n\t\t\t");
sb.Append(CreateConstructorTestBody(constructor));
sb.Append("\n\t\t}");
return sb.ToString();
}
public ConstructorInfo[] ReflectClassConstructors(string assemblyPath, string fullyQualifiedClassName)
{
// Retrieve the type of the class
System.Type type = GetClassType(assemblyPath, fullyQualifiedClassName);
// Return the list of properties
if(IncludeInheritedMembers)
return type.GetConstructors(BindingFlags.Public|BindingFlags.Instance);
else
return type.GetConstructors(BindingFlags.Public|BindingFlags.Instance|BindingFlags.DeclaredOnly);
}
public string CreatePropertyTestFixtureInit(string fullClassName)
{
StringBuilder sb = new StringBuilder();
sb.Append("[TestFixtureSetUp]\n");
sb.Append("\t\tpublic void FixtureInit()\n");
sb.Append("\t\t{\n");
sb.Append("\t\t\t//TODO: Initialize the ");
sb.Append(fullClassName);
sb.Append(" for the test suite with the desired constructor and variables\n");
sb.Append("\t\t\t");
sb.Append("m_");
sb.Append(GetCamelCaseName(GetClassName(fullClassName)));
sb.Append(" = new ");
sb.Append(fullClassName);
sb.Append("();\n");
sb.Append("\t\t}");
return sb.ToString();
}
public string CreatePropertyTestFixtureDispose(string className)
{
StringBuilder sb = new StringBuilder();
sb.Append("[TestFixtureTearDown]\n");
sb.Append("\t\tpublic void FixtureDispose()\n");
sb.Append("\t\t{\n");
sb.Append("\t\t\tm_");
sb.Append(GetCamelCaseName(className));
sb.Append(" = null;\n");
sb.Append("\t\t}");
return sb.ToString();
}
// Create the body of the property test
public string CreatePropertyTestBody(PropertyInfo property)
{
StringBuilder sb = new StringBuilder();
if(property.CanRead)
{
sb.Append("\t\t\t// Declare return variable to hold property get method\n");
sb.Append("\t\t\t");
sb.Append(property.PropertyType.ToString());
sb.Append(" _getValue = ");
sb.Append(GetTypeDefaultValue(property.PropertyType.ToString()));
sb.Append(";\n");
sb.Append("\n\t\t\t// Test get method\n");
sb.Append("\t\t\t_getValue = ");
if(property.GetAccessors()[0].IsStatic)
{
sb.Append(FullClassName);
}
else
{
sb.Append("m_");
sb.Append(GetCamelCaseName(GetClassName(FullClassName)));
}
sb.Append(".");
sb.Append(property.Name);
sb.Append(";\n");
}
if(property.CanWrite)
{
sb.Append("\n");
sb.Append("\t\t\t// Declare variable to hold property set method\n");
sb.Append("\t\t\t");
sb.Append(property.PropertyType.ToString());
sb.Append(" _setValue = ");
sb.Append(GetTypeDefaultValue(property.PropertyType.ToString()));
sb.Append(";\n");
sb.Append("\n\t\t\t// Test set method\n");
if(property.GetAccessors()[0].IsStatic)
{
sb.Append("\t\t\t");
sb.Append(FullClassName);
}
else
{
sb.Append("\t\t\tm_");
sb.Append(GetCamelCaseName(GetClassName(FullClassName)));
}
sb.Append(".");
sb.Append(property.Name);
sb.Append(" = _setValue");
sb.Append(";\n");
}
sb.Append("\t\t\t\n");
sb.Append("\t\t\t// Perform Assert Tests\n");
sb.Append("\t\t\t//TODO: Write Assert Tests for ");
sb.Append(property.Name);
sb.Append("()\n");
return sb.ToString();
}
// Creates the property test method
public string CreatePropertyTest(PropertyInfo property)
{
StringBuilder sb = new StringBuilder();
sb.Append("[Test, Ignore(\"Setup ");
sb.Append("Assert tests for the property ");
sb.Append(GetCaseName(property.Name));
sb.Append("\")]\n\t\tpublic void ");
sb.Append(GetCaseName(property.Name));
sb.Append("()\n");
sb.Append("\t\t{\n");
sb.Append(CreatePropertyTestBody(property));
sb.Append("\t\t}");
return sb.ToString();
}
public PropertyInfo[] ReflectClassProperties(string assemblyPath, string fullyQualifiedClassName)
{
// Retrieve the type of the class
System.Type type = GetClassType(assemblyPath, fullyQualifiedClassName);
// Return the list of properties
if(IncludeInheritedMembers)
return type.GetProperties(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance);
else
return type.GetProperties(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance|BindingFlags.DeclaredOnly);
}
public string CreateMethodTestInit(string fullClassName)
{
StringBuilder sb = new StringBuilder();
sb.Append("[SetUp]\n");
sb.Append("\t\tpublic void TestInit()\n");
sb.Append("\t\t{\n");
sb.Append("\t\t\t//TODO: Initialize the ");
sb.Append(fullClassName);
sb.Append(" for each test with the desired constructor and variables\n");
sb.Append("\t\t\t");
sb.Append("m_");
sb.Append(GetCamelCaseName(GetClassName(fullClassName)));
sb.Append(" = new ");
sb.Append(fullClassName);
sb.Append("();\n");
sb.Append("\t\t}");
return sb.ToString();
}
public string CreateMethodTestDispose(string className)
{
StringBuilder sb = new StringBuilder();
sb.Append("[TearDown]\n");
sb.Append("\t\tpublic void TestDispose()\n");
sb.Append("\t\t{\n");
sb.Append("\t\t\tm_");
sb.Append(GetCamelCaseName(className));
sb.Append(" = null;\n");
sb.Append("\t\t}");
return sb.ToString();
}
public string CreateMethodTestBody(MethodInfo method)
{
StringBuilder sb = new StringBuilder();
sb.Append("\t\t\t// Declare variables to pass to method call\n");
sb.Append("\t\t\t//TODO: Set values for variables\n");
ParameterInfo[] parameters = method.GetParameters();
for(int c = 0; c < parameters.Length; c++)
{
sb.Append("\t\t\t");
sb.Append(parameters[c].ParameterType.ToString());
sb.Append(" _");
sb.Append(parameters[c].Name);
sb.Append(" = ");
sb.Append(GetTypeDefaultValue(parameters[c].ParameterType.ToString()));
sb.Append(";\n");
}
sb.Append("\t\t\t\n");
if(method.ReturnType.ToString() != "System.Void")
{
sb.Append("\t\t\t// Declare return type to hold method result\n");
sb.Append("\t\t\t");
sb.Append(method.ReturnType.ToString());
sb.Append(" _returnValue;\n");
sb.Append("\t\t\t\n");
sb.Append("\t\t\t// Make method call\n");
sb.Append("\t\t\t_returnValue = ");
}
else
{
sb.Append("\t\t\t// Make method call\n");
sb.Append("\t\t\t");
}
if(method.IsStatic)
{
sb.Append(FullClassName);
}
else
{
sb.Append("m_");
sb.Append(GetCamelCaseName(GetClassName(FullClassName)));
}
sb.Append(".");
sb.Append(method.Name);
sb.Append("(");
for(int c = 0; c < parameters.Length; c++)
{
sb.Append(" _");
sb.Append(parameters[c].Name);
sb.Append(", ");
}
if(parameters.Length > 0)
sb.Remove(sb.Length -2 ,2);
sb.Append(");\n");
sb.Append("\t\t\t\n");
sb.Append("\t\t\t// Perform Assert Tests\n");
sb.Append("\t\t\t//TODO: Write Assert Tests for ");
sb.Append(method.Name);
sb.Append("()\n");
return sb.ToString();
}
// Creates the method test method
public string CreateMethodTest(MethodInfo method, Hashtable methodCount)
{
StringBuilder sb = new StringBuilder();
int currentOverloadCount = MethodOverloadCount(method.Name, methodCount);
sb.Append("[Test, Ignore(\"Setup ");
sb.Append(" parameter value(s) and Assert tests for the method ");
sb.Append(GetCaseName(method.Name));
sb.Append("\")]\n\t\tpublic void ");
sb.Append(GetCaseName(method.Name));
if(currentOverloadCount > 1)
{
sb.Append("_Overload");
sb.Append(currentOverloadCount.ToString());
}
sb.Append("()\n");
sb.Append("\t\t{\n");
sb.Append(CreateMethodTestBody(method));
sb.Append("\t\t}");
return sb.ToString();
}
// Returns the current number of overloads for a given method name
public int MethodOverloadCount(string methodName, Hashtable methodCount)
{
int currentCount = 0;
if(methodCount.ContainsKey(methodName))
{
currentCount = (int)methodCount[methodName];
}
for(int i = 0; i < methods.Length; i++)
{
if(methods[i].Name == methodName)
{
currentCount++;
if(methodCount.ContainsKey(methodName))
{
if(currentCount > (int)methodCount[methodName])
methodCount[methodName] = (int)methodCount[methodName] + 1;
}
else
methodCount.Add(methodName,1);
if(currentCount == (int)methodCount[methodName])
break;
}
}
return ((int)methodCount[methodName]);
}
public MethodInfo[] ReflectClassMethods(string assemblyPath, string fullyQualifiedClassName)
{
// Retrieve the type of the class
System.Type type = GetClassType(assemblyPath, fullyQualifiedClassName);
// Return the list of properties
if(IncludeInheritedMembers)
return type.GetMethods(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance);
else
return type.GetMethods(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance|BindingFlags.DeclaredOnly);
}
public System.Type GetClassType(string assemblyPath, string fullyQualifiedClassName)
{
// Load the assembly which contains the class to reflect
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFile(assemblyPath);
// Retrieve the type of the class
System.Type type = assembly.GetType(fullyQualifiedClassName);
// Release the assembly
assembly = null;
return type;
}
public string GetTypeDefaultValue(string typeName)
{
// init the variable value
string variableValue = string.Empty;
// determine the default variable value from the variable type
switch(typeName)
{
case "System.Binary":
case "System.Byte":
case "System.Int16":
case "System.Int32":
case "System.Int64":
{
variableValue = "0";
break;
}
case "System.String":
{
variableValue = "String.Empty";
break;
}
case "System.Boolean":
{
variableValue = "false";
break;
}
case "System.Guid":
{
variableValue = "Guid.NewGuid()";
break;
}
case "System.DateTime":
{
variableValue = "DateTime.MinValue";
break;
}
default:
{
variableValue = "null";
break;
}
}
return variableValue;
}
</script>
<%@ Assembly Name="System.Design" %>
<%@ Import Namespace="System.Reflection" %>
<%@ Import Namespace="System.Collections" %>
<%@ Import Namespace="System.Text" %>
<%@ Property Name="FullClassName" Type="System.String" Category="Template Options" Description="This is the fully qualified name of the class to test." %>
<%@ Property Name="IncludeInheritedMembers" Type="System.Boolean" Category="Template Options" Required="true" default="false" %>
<%@ Property Name="DeclaringTypeToExclude" Type="System.String" Category="Template Options" Required="false" %>
<%@ Property Name="GenerateConstructorClasses" Type="System.Boolean" Category="Constructor Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<%@ Property Name="GeneratePropertyClasses" Type="System.Boolean" Category="Property Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<%@ Property Name="GenerateMethodClasses" Type="System.Boolean" Category="Method Tests" Required="true" Default="true" Description="Should the appropriate test classes be generated." %>
<% InitTemplate(); %>
using System;
using NUnit.Framework;
using <%= GetNamespaceOnly(FullClassName)%>;
namespace <%= GetTestNamespace(FullClassName) %>
{
<%/*
----------------------------------------------
--------------- Constructors -----------------
----------------------------------------------
*/
if(GenerateConstructorClasses){
%>
#region Constructor Tests
[TestFixture]
public class ConstructorTesting
{
#region Test Preparation Methods
#region TestFixture SetUp and TearDown
[TestFixtureSetUp]
public void FixtureInit()
{
}
[TestFixtureTearDown]
public void FixtureDispose()
{
}
#endregion
#region Test SetUp and TearDown
[SetUp]
public void TestInit()
{
}
[TearDown]
public void TestDispose()
{
}
#endregion
#endregion
#region Test Methods
<% for(int i = 0; i < constructors.Length; i++){ %>
<% if( i == 0) {%>
<%= CreateConstructorTest(GetClassName(FullClassName),constructors[i])%>
<%}else{%>
<%= CreateConstructorTest(GetClassName(FullClassName) + "_Overload" + i.ToString(),constructors[i])%>
<%}}%>
#endregion
}
#endregion
<%}%>
<% if(GenerateMethodClasses) {%>
<%/*
----------------------------------------------
-------------- Static Methods ----------------
----------------------------------------------
*/%>
#region Static Method Tests
[TestFixture]
public class StaticMethodTesting
{
#region Test Preparation Methods
#region TestFixture Setup and TearDown
[TestFixtureSetUp]
public void FixtureInit()
{
}
[TestFixtureTearDown]
public void FixtureDispose()
{
}
#endregion
#region Test SetUp and TearDown
[SetUp]
public void TestInit()
{
}
[TearDown]
public void TestDispose()
{
}
#endregion
#endregion
#region Test Methods
<% for(int i = 0; i < methods.Length; i++){
if(methods[i].IsStatic && !methods[i].Name.StartsWith("get_") && !methods[i].Name.StartsWith("set_") && methods[i].DeclaringType.ToString() != DeclaringTypeToExclude && methods[i].DeclaringType.ToString() != "System.Object"){%>
<%= CreateMethodTest(methods[i], staticMethodCount) %>
<%}}%>
#endregion
}
#endregion
<%/*
----------------------------------------------
------------------ Methods -------------------
----------------------------------------------
*/%>
#region Method Tests
[TestFixture]
public class MethodTesting
{
// Variable to hold object to be tested for reuse by init functions
<%= FullClassName %> m_<%= GetCamelCaseName(GetClassName(FullClassName)) %>;
#region Test Preparation Methods
#region TestFixture SetUp and TearDown
[TestFixtureSetUp]
public void FixtureInit()
{
}
[TestFixtureTearDown]
public void FixtureDispose()
{
}
#endregion
#region Test SetUp and TearDown
<%= CreateMethodTestInit(FullClassName) %>
<%= CreateMethodTestDispose(GetClassName(FullClassName)) %>
#endregion
#endregion
#region Test Methods
<% for(int i = 0; i < methods.Length; i++){
if(!methods[i].IsStatic && !methods[i].Name.StartsWith("get_") && !methods[i].Name.StartsWith("set_") && methods[i].DeclaringType.ToString() != DeclaringTypeToExclude && methods[i].DeclaringType.ToString() != "System.Object"){%>
<%= CreateMethodTest(methods[i], instanceMethodCount) %>
<%}}%>
#endregion
}
#endregion
<%}%>
<% if(GeneratePropertyClasses) {%>
<%/*
----------------------------------------------
----------------- Properties -----------------
----------------------------------------------
*/%>
#region Property Tests
[TestFixture]
public class PropertyTesting
{
// Variable to hold object to be tested for reuse by init functions
<%= FullClassName %> m_<%= GetCamelCaseName(GetClassName(FullClassName)) %>;
#region Test Preparation Methods
#region TestFixture SetUp and TearDown
<%= CreatePropertyTestFixtureInit(FullClassName) %>
<%= CreatePropertyTestFixtureDispose(GetClassName(FullClassName)) %>
#endregion
#region Test SetUp and TearDown
[SetUp]
public void TestInit()
{
}
[TearDown]
public void TestDispose()
{
}
#endregion
#endregion
#region Test Methods
<% for(int i = 0; i < properties.Length; i++){
if(properties[i].DeclaringType.ToString() != DeclaringTypeToExclude){%>
<%= CreatePropertyTest(properties[i])%>
<%}}%>
#endregion
}
#endregion
<%}%>
}
<script runat="template">
ConstructorInfo[] constructors = null;
MethodInfo[] methods = null;
PropertyInfo[] properties = null;
// Hashtables used to identify overloads for methods and constructors
Hashtable staticMethodCount = new Hashtable();
Hashtable instanceMethodCount = new Hashtable();
Hashtable instanceConstructorCount = new Hashtable();
[Editor(typeof(System.Windows.Forms.Design.FileNameEditor), typeof(System.Drawing.Design.UITypeEditor))]
[CodeTemplateProperty(CodeTemplatePropertyOption.Required)]
[Category("Template Options")]
[Description("This is the full path, including the assembly name, of the assembly which contains the class to test.")]
public string AssemblyPath
{
get { return assemblyPath; }
set { assemblyPath = value; }
}
private string assemblyPath;
public void InitTemplate()
{
//Debugger.Break();
// Reflect object properties
constructors = ReflectClassConstructors(AssemblyPath, FullClassName);
methods = ReflectClassMethods(AssemblyPath, FullClassName);
properties = ReflectClassProperties(AssemblyPath, FullClassName);
}
public string GetCamelCaseName(string value)
{
return value.Substring(0, 1).ToLower() + value.Substring(1);
}
public string GetCaseName(string value)
{
return value.Substring(0, 1).ToUpper() + value.Substring(1);
}
// Returns just the class name given a fully qualified class name; i.e. BHCS.Portal.McCoy.Engine.Entities.Module
public string GetClassName(string fullClassName)
{
return fullClassName.Substring(fullClassName.LastIndexOf(".") + 1);
}
public string GetNamespaceOnly(string fullClassName)
{
return fullClassName.Substring(0,fullClassName.LastIndexOf("."));
}
public string GetTestNamespace(string fullClassName)
{
return GetNamespaceOnly(fullClassName) + ".Test." + GetClassName(fullClassName);
}
public string CreateConstructorTestBody(ConstructorInfo constructor)
{
StringBuilder sb = new StringBuilder();
sb.Append("// Declare variables to pass to constructor call\n");
sb.Append("\t\t\t//TODO: Set values for variables\n");
ParameterInfo[] parameters = constructor.GetParameters();
for(int c = 0; c < parameters.Length; c++)
{
sb.Append("\t\t\t");
sb.Append(parameters[c].ParameterType.ToString());
sb.Append(" _");
sb.Append(parameters[c].Name);
sb.Append(" = ");
sb.Append(GetTypeDefaultValue(parameters[c].ParameterType.ToString()));
sb.Append(";\n");
}
sb.Append("\t\t\t\n");
sb.Append("\t\t\t// Declare return type to hold constructor result\n");
sb.Append("\t\t\t");
sb.Append(FullClassName);
sb.Append(" _returnValue;\n");
sb.Append("\t\t\t\n");
sb.Append("\t\t\t// Instantiate object\n");
sb.Append("\t\t\t_returnValue = new ");
sb.Append(FullClassName);
sb.Append("(");
for(int c = 0; c < parameters.Length; c++)
{
sb.Append(" _");
sb.Append(parameters[c].Name);
sb.Append(", ");
}
if(parameters.Length > 0)
sb.Remove(sb.Length -2 ,2);
sb.Append(");\n");
sb.Append("\t\t\t\n");
sb.Append("\t\t\t// Perform Assert Tests\n");
sb.Append("\t\t\t//TODO: Write Assert Tests for object instance\n");
return sb.ToString();
}
// Creates the constructor test method
public string CreateConstructorTest(string constructorName, ConstructorInfo constructor)
{
StringBuilder sb = new StringBuilder();
sb.Append("[Test, Ignore(\"Setup ");
sb.Append(FullClassName);
sb.Append(" parameter value and Assert tests for the constructor\")]\n");
sb.Append("\t\tpublic void ");
sb.Append(constructorName);
sb.Append("()\n");
sb.Append("\t\t{\n\t\t\t");
sb.Append(CreateConstructorTestBody(constructor));
sb.Append("\n\t\t}");
return sb.ToString();
}
public ConstructorInfo[] ReflectClassConstructors(string assemblyPath, string fullyQualifiedClassName)
{
// Retrieve the type of the class
System.Type type = GetClassType(assemblyPath, fullyQualifiedClassName);
// Return the list of properties
if(IncludeInheritedMembers)
return type.GetConstructors(BindingFlags.Public|BindingFlags.Instance);
else
return type.GetConstructors(BindingFlags.Public|BindingFlags.Instance|BindingFlags.DeclaredOnly);
}
public string CreatePropertyTestFixtureInit(string fullClassName)
{
StringBuilder sb = new StringBuilder();
sb.Append("[TestFixtureSetUp]\n");
sb.Append("\t\tpublic void FixtureInit()\n");
sb.Append("\t\t{\n");
sb.Append("\t\t\t//TODO: Initialize the ");
sb.Append(fullClassName);
sb.Append(" for the test suite with the desired constructor and variables\n");
sb.Append("\t\t\t");
sb.Append("m_");
sb.Append(GetCamelCaseName(GetClassName(fullClassName)));
sb.Append(" = new ");
sb.Append(fullClassName);
sb.Append("();\n");
sb.Append("\t\t}");
return sb.ToString();
}
public string CreatePropertyTestFixtureDispose(string className)
{
StringBuilder sb = new StringBuilder();
sb.Append("[TestFixtureTearDown]\n");
sb.Append("\t\tpublic void FixtureDispose()\n");
sb.Append("\t\t{\n");
sb.Append("\t\t\tm_");
sb.Append(GetCamelCaseName(className));
sb.Append(" = null;\n");
sb.Append("\t\t}");
return sb.ToString();
}
// Create the body of the property test
public string CreatePropertyTestBody(PropertyInfo property)
{
StringBuilder sb = new StringBuilder();
if(property.CanRead)
{
sb.Append("\t\t\t// Declare return variable to hold property get method\n");
sb.Append("\t\t\t");
sb.Append(property.PropertyType.ToString());
sb.Append(" _getValue = ");
sb.Append(GetTypeDefaultValue(property.PropertyType.ToString()));
sb.Append(";\n");
sb.Append("\n\t\t\t// Test get method\n");
sb.Append("\t\t\t_getValue = ");
if(property.GetAccessors()[0].IsStatic)
{
sb.Append(FullClassName);
}
else
{
sb.Append("m_");
sb.Append(GetCamelCaseName(GetClassName(FullClassName)));
}
sb.Append(".");
sb.Append(property.Name);
sb.Append(";\n");
}
if(property.CanWrite)
{
sb.Append("\n");
sb.Append("\t\t\t// Declare variable to hold property set method\n");
sb.Append("\t\t\t");
sb.Append(property.PropertyType.ToString());
sb.Append(" _setValue = ");
sb.Append(GetTypeDefaultValue(property.PropertyType.ToString()));
sb.Append(";\n");
sb.Append("\n\t\t\t// Test set method\n");
if(property.GetAccessors()[0].IsStatic)
{
sb.Append("\t\t\t");
sb.Append(FullClassName);
}
else
{
sb.Append("\t\t\tm_");
sb.Append(GetCamelCaseName(GetClassName(FullClassName)));
}
sb.Append(".");
sb.Append(property.Name);
sb.Append(" = _setValue");
sb.Append(";\n");
}
sb.Append("\t\t\t\n");
sb.Append("\t\t\t// Perform Assert Tests\n");
sb.Append("\t\t\t//TODO: Write Assert Tests for ");
sb.Append(property.Name);
sb.Append("()\n");
return sb.ToString();
}
// Creates the property test method
public string CreatePropertyTest(PropertyInfo property)
{
StringBuilder sb = new StringBuilder();
sb.Append("[Test, Ignore(\"Setup ");
sb.Append("Assert tests for the property ");
sb.Append(GetCaseName(property.Name));
sb.Append("\")]\n\t\tpublic void ");
sb.Append(GetCaseName(property.Name));
sb.Append("()\n");
sb.Append("\t\t{\n");
sb.Append(CreatePropertyTestBody(property));
sb.Append("\t\t}");
return sb.ToString();
}
public PropertyInfo[] ReflectClassProperties(string assemblyPath, string fullyQualifiedClassName)
{
// Retrieve the type of the class
System.Type type = GetClassType(assemblyPath, fullyQualifiedClassName);
// Return the list of properties
if(IncludeInheritedMembers)
return type.GetProperties(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance);
else
return type.GetProperties(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance|BindingFlags.DeclaredOnly);
}
public string CreateMethodTestInit(string fullClassName)
{
StringBuilder sb = new StringBuilder();
sb.Append("[SetUp]\n");
sb.Append("\t\tpublic void TestInit()\n");
sb.Append("\t\t{\n");
sb.Append("\t\t\t//TODO: Initialize the ");
sb.Append(fullClassName);
sb.Append(" for each test with the desired constructor and variables\n");
sb.Append("\t\t\t");
sb.Append("m_");
sb.Append(GetCamelCaseName(GetClassName(fullClassName)));
sb.Append(" = new ");
sb.Append(fullClassName);
sb.Append("();\n");
sb.Append("\t\t}");
return sb.ToString();
}
public string CreateMethodTestDispose(string className)
{
StringBuilder sb = new StringBuilder();
sb.Append("[TearDown]\n");
sb.Append("\t\tpublic void TestDispose()\n");
sb.Append("\t\t{\n");
sb.Append("\t\t\tm_");
sb.Append(GetCamelCaseName(className));
sb.Append(" = null;\n");
sb.Append("\t\t}");
return sb.ToString();
}
public string CreateMethodTestBody(MethodInfo method)
{
StringBuilder sb = new StringBuilder();
sb.Append("\t\t\t// Declare variables to pass to method call\n");
sb.Append("\t\t\t//TODO: Set values for variables\n");
ParameterInfo[] parameters = method.GetParameters();
for(int c = 0; c < parameters.Length; c++)
{
sb.Append("\t\t\t");
sb.Append(parameters[c].ParameterType.ToString());
sb.Append(" _");
sb.Append(parameters[c].Name);
sb.Append(" = ");
sb.Append(GetTypeDefaultValue(parameters[c].ParameterType.ToString()));
sb.Append(";\n");
}
sb.Append("\t\t\t\n");
if(method.ReturnType.ToString() != "System.Void")
{
sb.Append("\t\t\t// Declare return type to hold method result\n");
sb.Append("\t\t\t");
sb.Append(method.ReturnType.ToString());
sb.Append(" _returnValue;\n");
sb.Append("\t\t\t\n");
sb.Append("\t\t\t// Make method call\n");
sb.Append("\t\t\t_returnValue = ");
}
else
{
sb.Append("\t\t\t// Make method call\n");
sb.Append("\t\t\t");
}
if(method.IsStatic)
{
sb.Append(FullClassName);
}
else
{
sb.Append("m_");
sb.Append(GetCamelCaseName(GetClassName(FullClassName)));
}
sb.Append(".");
sb.Append(method.Name);
sb.Append("(");
for(int c = 0; c < parameters.Length; c++)
{
sb.Append(" _");
sb.Append(parameters[c].Name);
sb.Append(", ");
}
if(parameters.Length > 0)
sb.Remove(sb.Length -2 ,2);
sb.Append(");\n");
sb.Append("\t\t\t\n");
sb.Append("\t\t\t// Perform Assert Tests\n");
sb.Append("\t\t\t//TODO: Write Assert Tests for ");
sb.Append(method.Name);
sb.Append("()\n");
return sb.ToString();
}
// Creates the method test method
public string CreateMethodTest(MethodInfo method, Hashtable methodCount)
{
StringBuilder sb = new StringBuilder();
int currentOverloadCount = MethodOverloadCount(method.Name, methodCount);
sb.Append("[Test, Ignore(\"Setup ");
sb.Append(" parameter value(s) and Assert tests for the method ");
sb.Append(GetCaseName(method.Name));
sb.Append("\")]\n\t\tpublic void ");
sb.Append(GetCaseName(method.Name));
if(currentOverloadCount > 1)
{
sb.Append("_Overload");
sb.Append(currentOverloadCount.ToString());
}
sb.Append("()\n");
sb.Append("\t\t{\n");
sb.Append(CreateMethodTestBody(method));
sb.Append("\t\t}");
return sb.ToString();
}
// Returns the current number of overloads for a given method name
public int MethodOverloadCount(string methodName, Hashtable methodCount)
{
int currentCount = 0;
if(methodCount.ContainsKey(methodName))
{
currentCount = (int)methodCount[methodName];
}
for(int i = 0; i < methods.Length; i++)
{
if(methods[i].Name == methodName)
{
currentCount++;
if(methodCount.ContainsKey(methodName))
{
if(currentCount > (int)methodCount[methodName])
methodCount[methodName] = (int)methodCount[methodName] + 1;
}
else
methodCount.Add(methodName,1);
if(currentCount == (int)methodCount[methodName])
break;
}
}
return ((int)methodCount[methodName]);
}
public MethodInfo[] ReflectClassMethods(string assemblyPath, string fullyQualifiedClassName)
{
// Retrieve the type of the class
System.Type type = GetClassType(assemblyPath, fullyQualifiedClassName);
// Return the list of properties
if(IncludeInheritedMembers)
return type.GetMethods(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance);
else
return type.GetMethods(BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance|BindingFlags.DeclaredOnly);
}
public System.Type GetClassType(string assemblyPath, string fullyQualifiedClassName)
{
// Load the assembly which contains the class to reflect
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFile(assemblyPath);
// Retrieve the type of the class
System.Type type = assembly.GetType(fullyQualifiedClassName);
// Release the assembly
assembly = null;
return type;
}
public string GetTypeDefaultValue(string typeName)
{
// init the variable value
string variableValue = string.Empty;
// determine the default variable value from the variable type
switch(typeName)
{
case "System.Binary":
case "System.Byte":
case "System.Int16":
case "System.Int32":
case "System.Int64":
{
variableValue = "0";
break;
}
case "System.String":
{
variableValue = "String.Empty";
break;
}
case "System.Boolean":
{
variableValue = "false";
break;
}
case "System.Guid":
{
variableValue = "Guid.NewGuid()";
break;
}
case "System.DateTime":
{
variableValue = "DateTime.MinValue";
break;
}
default:
{
variableValue = "null";
break;
}
}
return variableValue;
}
</script>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通