Con*_*her 3 c# tdd unit-testing moq mocking
我有一种情况,在MS Dynamics Crm中它使用密封类和只读属性返回一些对象(我只能假设使用内部构造函数或内部属性集).这些家伙不会从我可以使用的界面继承.显然,如果我控制了这段代码,我会有更多的控制权,但因为它在底层的MS Dynamics框架中,我有点卡住了.
我想模拟/覆盖的类名为AliasedValue.我想嘲笑它的原因是我试图模拟对动态的调用,并想假装我得到了一些别名值.
所以这是场景,我想创建一个Dynamics将返回的示例实体......如下所示:
var new_entity = new Entity("new_entity")
{
Attributes = new AttributeCollection
{
{"new_name", "BR"},
{"createdon", DateTime.Now.AddDays(-1).Date},
{"new_field", "My field"},
{"new_contact", new AliasedValue {*****} }
}
};
Run Code Online (Sandbox Code Playgroud)
所以我引用了一个"联系"实体(实时它以AliasedValue的形式返回).在测试时,我想确保我的代码处理可能在此字段中返回的某些值(例如,它知道如何处理别名值,如果没有返回链接的联系人,则它不会爆炸,等等).
因此,如果您点击了AliasedValue的链接,您会发现属性是只读的...所以我无法设置测试数据......
接下来,我打算创建自己的类并覆盖整个事情......但它是密封的......
最重要的是,正如你可能已经猜到的那样,Moq并不喜欢试图模拟密封的课程.
我已经读过我需要购买一些"更好"的模拟框架才能做到这一点,但我真的不想为了解决这个问题而花费一些额外的钱.
任何人都有一个很好的小解决方案让我绕过这个?
更新澄清
返回的示例如下.我有一个服务,将被嘲笑返回上述对象.或者实际返回的是包含上述对象的集合.所以这是这样的:
var service = new Mock<IOrganizationService>();
service
.Setup(s => s.RetrieveMultiple(null))
.Returns(new EntityCollection (new List<Entity> {new_entity}));
Run Code Online (Sandbox Code Playgroud)
这很好,我可以返回上面的实体并用它做我想做的事.所以,在我创建了上面的实体后,我通过我的模拟服务返回它,我在"EntityCollection"中得到了上述实体.一旦我拥有了我的实体,我就按如下方式访问该属性:
var aliasedContact = (AliasedValue)new_entity.Attributes["new_contact"];
Run Code Online (Sandbox Code Playgroud)
也许我很傻,但我无法得到答案(由Lunivore)解决这个问题......(添加评论以获得反馈......)
通过添加一个非常简单的适配器类从第三方库中抽象出来,您可以通过检查来测试它.而不是扩展您的目标类,只需将您的新类组合在其顶部.它可以具有相同的方法名称,相同的属性等(虽然它没有) - 它只是委托给密封的类.
如果你有一个类返回你的密封类,请将它们包装起来.所以它可能看起来像这样:
var crmWrapper = new MSDynamicsCrmWrapper(_myMsDynamicsCrm);
var entityWrapper = crmWrapper.AliasedValue(url);
Run Code Online (Sandbox Code Playgroud)
并且crmWrapper将执行:
public EntityWrapper AliasedValue(Url url)
{
var entity = delegateCrm.AliasedValue(url);
return new EntityWrapper(entity);
}
Run Code Online (Sandbox Code Playgroud)
简单.您只需要委派您实际使用的那些方法.
这不仅允许你嘲笑课程,而且如果下一版本的MS Dynamics稍微改变了API,或者结果是奇怪的行为或性能不佳,它可以让你控制.此外,您正在将API缩小到您实际使用的位,因此代码甚至可能更容易维护.
计算中没有任何东西可以解决另一层抽象问题......
| 归档时间: |
|
| 查看次数: |
4215 次 |
| 最近记录: |