Минимальная версия: 3.1.416.3
Мы обнаружили ошибку, вызванную тем, что событие не было отписано. Я пытаюсь написать модульный тест, чтобы убедиться, что событие отписано. Можно ли это проверить с помощью Mock<T>.Verify(expression)
?
Моя первоначальная мысль была:
mockSource.Verify(s => s.DataChanged -= It.IsAny<DataChangedHandler>());
Но видимо
Дерево выражений не может содержать оператор присваивания
Затем я попытался
mockSource.VerifySet(s => s.DataChanged -= It.IsAny<DataChangedHandler>());
Но это дает мне
System.ArgumentException: Expression не является вызовом задающего свойства.
Как я могу убедиться, что отписка произошла?
Как используется событие
public class Foo
{
private ISource _source;
public Foo(ISource source)
{
_source = source;
}
public void DoCalculation()
{
_source.DataChanged += ProcessData;
var done = false;
while(!done)
{
if(/*something is wrong*/)
{
Abort();
return;
}
//all the things that happen
if(/*condition is met*/)
{
done = true;
}
}
_source.DataChanged -= ProcessData;
}
public void Abort()
{
_source.DataChanged -= ProcessData; //this line was added to fix the bug
//other cleanup
}
private void ProcessData(ISource)
{
//process the data
}
}
Не обращайте внимания на запутанный характер кода, мы имеем дело с сигналами от внешнего оборудования. Это действительно имеет смысл для алгоритма.