在Blend设计时使用Moq

5

这可能有点超前,但假设我想在ViewModel中使用Moq来创建一些设计时数据,就像这样:

public class SomeViewModel
{
   public SomeViewModel(ISomeDependency dependency)
   {
      if (IsInDesignMode)
      {
         var mock = new Mock<ISomeDependency>();
         dependency = mock.Object; // this throws!  
      }
   }
}

这个模拟可以被设置来完成一些任务,但你应该明白这个意思。

我的问题是,在Blend的设计时间里,这段代码会抛出一个InvalidCastException异常,异常信息大致为“无法将类型为'Castle.Proxies.ISomeDependencyProxy2b3a8f3188284ff0b1129bdf3d50d3fc'的对象转换为类型 'ISomeDependency'。”尽管这看起来与Moq无关,但我希望这个Moq示例能够帮助解决问题;)

你有什么想法吗?

谢谢!

3个回答

1

我遇到了类似的问题,但是类型转换来自于一个动态生成的程序集(Blend_RuntimeGeneratedTypesAssembly),它伪装成我的某个类型。

原因不明。

这让我疯狂。


1
由于类型程序集 A 针对完整框架和设计时数据项目 B 针对客户端工厂,导致了各种奇怪的问题发生。 - user1228

1

我曾经认为我需要做这种技巧,但经过多次尝试和搜索,发现Blend 4现在可以基于现有类创建设计时样本数据上下文。

这有效地为您提供了一个虚拟类,看起来就像您的VM类,以便您可以添加绑定等。

它运行得足够好,这是我们现在推荐的技术。

这种方法可能的缺点是,如果您需要您的真实VM执行某种交互,则代理当然无法执行该操作-您必须手动更改值或切换到另一个设计时对象。但在实践中,我很少遇到这种情况。大多数时候,您设置VM的状态,然后花费很长时间使其外观正确。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接