Moq バージョン: 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: 式はプロパティ セッターの呼び出しではありません。
登録解除が行われたことをどのように確認できますか?
イベントの利用方法
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
}
}
コードの複雑な性質を無視して、外部ハードウェアからの信号を扱っています。これは実際にはアルゴリズムにとって理にかなっています。