It’s time to add a new test:
'@TestMethod("Initialize")
Private Sub WhenThereIsAForm_ThenItCanBeAssigned()
Dim testFormAuditor As FormAuditor
Set testFormAuditor = New FormAuditor
testFormAuditor.Init Forms("TestForm")
End Sub
This test is in my new RubberDuck test module “TestGivenFormAuditorInit”.
It won’t even compile yet because I don’t have an Init function.
Currently, the FormAuditor is linked specifically to the Test Form using the Class_Initialize event which looks like this:
Private Sub Class_Initialize()
Set FormToAudit = Forms("TestForm")
FormToAudit.BeforeUpdate = "[Event Procedure]"
arrTrackedControlTypes = Array(acComboBox, acTextBox, acCheckBox, acOptionGroup)
End Sub
I am going to change this from the Class_Initialize (which won’t take any parameters) to the Init function and then have the Class_Initialize function call the Init function like this:
Private Sub Class_Initialize()
Init Forms("TestForm")
End Sub
Public Sub Init(theForm As Access.Form, Optional ArrayOfTrackedControlTypes As Variant)
Set FormToAudit = Forms("TestForm")
FormToAudit.BeforeUpdate = "[Event Procedure]"
If IsMissing(ArrayOfTrackedControlTypes) Then ArrayOfTrackedControlTypes = Array(acComboBox, acTextBox, acCheckBox, acOptionGroup)
arrTrackedControlTypes = ArrayOfTrackedControlTypes
End Sub
So I have made the Array of tracked control types into an optional parameter and am assigning a default set of controls if they aren’t specified.
This code allows all my other tests to pass because they are relying on the Class_Initialize to setup this form. However, I am going to want to update my tests to specifically add the TestForm. I was hoping the only place I needed to do this was in the ModuleInitialize() function, but it turns out that is not the case. I am going to have to find any instance of FormAuditor I am declaring and refactor it to use the new init method.
Before I do that, I want the current test to pass and it will if I add the same form open commands to the ModuleInitialize function in the new module. So I’ll do that first so I am passing all tests. Then next time I can refactor the other tests.