我一直在使用Moq模拟各种CRM早期绑定实体,因此可以对插件进行单元测试。我想伪造或模拟一个活动帐户,但问题是该statecode字段是只读字段而不是虚拟字段。例如,当我尝试模拟Account早期绑定的实体以指定statecode在访问它时应返回的内容,我得到:
var accountMock = new Mock<Account>();
accountMock.SetupGet(x => x.statecode).Returns(AccountState.Active);
Run Code Online (Sandbox Code Playgroud)
并NotSupportedException抛出:Invalid setup on a non-virtual (overridable in VB) member: x => x.statecode。发生这种情况是因为在SDK提供的Account的早期绑定包装器类中,该statecode字段不是虚拟的。最小起订量不能像我要求的那样覆盖它!我想:“为什么不为Account我上的课做包装?”。
我可以通过将statecode要模拟的每个实体的属性设置为来更改生成的代码virtual,但是当/如果重新生成实体包装器,这不会停留在周围。这似乎也不是起订量的方式,但我可能会误会。
我目前的工作备用方法是从文件中读取一个已激活的XML序列化帐户,但是由于我基本上有一个要读取的示例数据文件,因此这实际上使模拟的目的无法实现。它有效,但不是在嘲笑。
我最有前途的工作是制作一个TestAccount包装器,该包装器扩展了Account并使其看起来既可以设置又可以得到statecode。这是最有前途的,因为我实际上可以模拟该TestAccount类,告诉OrganizationService返回一个active statecode和statuscode(这样做!),并确认它是type时Entity,它具有正确的字段。当TestAccount实例最终转换为早期绑定的Account类型时,它失败了。该statuscode设置卡,但statecode因为不存在用于公共设置器没有可能statecode像有是statuscode。
我将通过代码解释!
// Wrapper class for Account so I can mock active and inactive Accounts by changing the statecode …Run Code Online (Sandbox Code Playgroud)