Я уверен, что после того, как тест написан, это будет указать на некоторые вещи, которые необходимо будет изменить для того, чтобы получить все работает с пользовательским интерфейсом, но в основном у меня есть это:Как я могу протестировать мое приложение vb.net с резьбой?
frmMain:
Dim totalFinished as Integer = 0
reporter as Func(Of Object) = Function()
totalFinished += 1
return Nothing
End Function
classWithAsync.setReporter(reporter)
classWithAsync.BeginCalculation() ' ignore that this is a private method call
' there is another method I'm leaving out (the public one) which just does
' some set up stuff and then calls BeginCalculation
' Note: this notice isn't actually in my code
ClassWithAsync:
Private Async Sub BeginCalculation()
' some logic here
If synchronous Then
CalculatorCalculate(calculator)
Else
Await calculatorAsyncCalculate(calculator)
End If
End Sub
Private Async Function calculatorAsyncCalculate(ByVal calculator as Calculatable) as Hashtable
Dim result as Hashtable
result = Await Tasks.Task.Run(Function() as Hashtable
return calculator.Calculate()
EndFunction)
reporter.Invoke()
return result
End Function
Private Function CalculatorCalculate(ByVal calculator as Calculatable) as Hashtable
Dim result as Hashtable
result = calculator.Calculate()
reporter.Invoke()
return result
End Function
намерение здесь, чтобы репортер вызывать дважды. Что я работаю в синхронной версии .. но тест с резьбой действует так, как будто поток даже не запускался (возможно, из-за того, что выполнение продолжается, а утверждение оценивается до завершения потоков)
Вот мои тесты:
Synchronous: (Передает)
<TestMethod> Public Sub UpdatesForEachSynchronousProduct()
Dim data As Hashtable = TestData.GenerateGroupData("LTD,WDL")
CreateMockCalculators(data, privateTarget)
privateTarget.SetFieldOrProperty("reporter", reporter)
privateTarget.SetFieldOrProperty("synchronous", True)
privateTarget.Invoke("BeginCalculation")
Assert.AreEqual(2, totalCalculated)
End Sub
асинхронный: (не Pass)
<TestMethod> Public Sub UpdatesForEachAsyncProduct()
Dim data As Hashtable = TestData.GenerateGroupData("LTD,WDL")
CreateMockCalculators(data, privateTarget)
privateTarget.SetFieldOrProperty("reporter", reporter)
privateTarget.SetFieldOrProperty("synchronous", False)
privateTarget.Invoke("BeginCalculation")
Assert.AreEqual(2, totalCalculated)
End Sub
погрешность для этого является то, что EXP ected 2, но totalCalculated был 0.
Итак, есть ли способ сделать Assert ждать, пока потоки не будут выполнены?
Возможно, вам это поможет: http://stackoverflow.com/q/12159/951890 –