C# 在UnitTest期间,在代理类型的建模开始唤醒时需要帮助

C# 在UnitTest期间,在代理类型的建模开始唤醒时需要帮助,c#,unit-testing,delegates,moles,C#,Unit Testing,Delegates,Moles,在我的类中,我声明了一个委托类型,我正在创建它的一个实例,然后调用该实例的BeginInvoke: public class ClassA { ... public delegate bool MyDelegate(int x); ... public void MethodA() { ... var myDelegate = new MyDelegate(Foo); myDelegate.BeginInvo

在我的类中,我声明了一个委托类型,我正在创建它的一个实例,然后调用该实例的BeginInvoke:

public class ClassA
{
    ...
    public delegate bool MyDelegate(int x);
    ...
    public void MethodA()
    {
        ...
        var myDelegate = new MyDelegate(Foo);
        myDelegate.BeginInvoke(...);
        ...
    }
    ...
}
在为MethodA编写单元测试时,我实际上不希望BeginInvoke被调用。我想做的是使用Moles框架来mole出BeginInvoke调用。通常,我会试试

MMyDelegate.AllInstances.BeginInvoke... = (...) => { /* something here */ }
但是我无法让moles为MyDelegate类型生成任何内容


根据“公共语言运行库为每种委托类型提供BeginInvoke和EndInvoke方法”。如果是这种情况,并且BeginInvoke甚至不是委托类中的一个方法(由CLR提供),那么是否有可能对其进行mole?其他人是否有幸从代理类型中脱颖而出?

我不太了解Microsoft Moles,但我试图通过Microsoft Fakes实现同样的效果(实际上,这是Visual Studio 2012 Premium和Ultimate中内置的Microsoft Moles的继承人)

当我试图构建假组件(微软称之为赝品和垫片,而不是鼹鼠和短棒)时,我得到了以下警告:

Warning 1   Cannot generate stub for AssemblyUnderTest.FooDelegate: type is sealed. d:\Sources\Projects\PlayingWithMoles\PlayingWithMoles\Fakes\AssemblyUnderTest.fakes
Warning 2   Cannot generate shim for AssemblyUnderTest.FooDelegate: type is a delegate. d:\Sources\Projects\PlayingWithMoles\PlayingWithMoles\Fakes\AssemblyUnderTest.fakes
(要获得此警告,您应该关闭fakes配置文件中的附加诊断(我不确定fakes和Moles中的格式是否相同):


然后,您可以使用单独的接口轻松提取依赖项,并将其注入到您的服务消费者中,或者使用Microsoft Moles(或Microsoft Fakes)伪造依赖项,而无需添加其他层。

我不明白。BeginInvoke()充满了龙,它启动了一个线程池线程来运行委托目标。线程是很难的。单元测试代码没有必要绕过代码失败的最有可能和最不可诊断的原因。如果你找不到鼹鼠、赝品或他们贴上的任何标签,肯定是因为那些框架不想让你忽略它你应该测试的最重要的东西是什么。
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" **Diagnostic="true"**>
  <Assembly Name="AssemblyUnderTest"/>
</Fakes>
class SomeService
{
  Task<string> GetSomeResult()
  {
    // Performing long-running operation to obtain the result
  }
}

class YourServiceConsumer
{
  private void YourMethod()
  {
     Task<string> task = service.GetSomeResult();
  }
}