sna*_*its 5 c# mocking dynamics-crm dynamics-crm-2013
在过去的一周左右的时间里,我一直在使用FakeXrmEasy编写单元测试,我通常对它的工作方式感到满意。但是有一个地方我无法按照我的意愿使模拟工作。
在Dynamics CRM安装中,有一个正在运行的插件,可以在销售订单上设置订单号。如果没有此选项,则返回的订单号值始终为null。
我怎样才能告诉FakeXrmEasy模拟设置订单号值?理想情况下,我希望大致像这样进入请求管道:
var context = new FakeXrmEasy.XrmFakedContext();
context.Initialize(TestEntities);
context.TamperWithResults<RetrieveRequest>( x => {
return SetOrderNumber(x);
});
context.GetFakedOrganizationService();
var result = context.Retrieve(...);
Run Code Online (Sandbox Code Playgroud)
我可以尝试使用.AddExecutionMock模拟整个结果,但是有问题的响应用于验证销售订单确实以正确的值保存。
更新-更详细的信息 也许我在问问题时应该更详细一些。我刚刚加入了一个现有项目,并且正在为现有代码编写测试。失败的测试正在运行执行此操作的功能:
现在,由于该函数尝试保存订单,因此除非我可以指定将由Create()调用返回的Guid,否则无法将其添加到安装程序的上下文中。
假设您正在编写一个单元测试来测试该插件(填充订单号的插件)之后发生的情况,最简单的解决方案是使用其中的订单号初始化销售订单,这将用作前提条件。默认情况下会自动模拟查询,因此应该返回该值。因此不需要在管道中注入任何东西。
例子:
[Fact]
public void Example_test()
{
var context = new XrmFakedContext();
var service = context.GetFakedOrganizationService();
var salesOrder = new SalesOrder() { Id = Guid.NewGuid(), OrderNumber = 69 };
context.Initialize(new List<Entity>() { salesOrder });
//some stuff
//....
//Queries are automatically mocked so any LINQ,FetchXml,
//QueryExpression or QueryByAttrubute should return the values you had in
//the context initialisation or as a result of updates / creates during the test execution
var result = context.CreateQuery<SalesOrder>().FirstOrDefault();
Assert.Equal(result.OrderNumber, 69);
}
Run Code Online (Sandbox Code Playgroud)
[编辑]:如果您想在创建之后注入 guid,您可以使用 OutputParameters 属性。这是 FollowupPlugin 的示例。
插件执行有几个重载,该示例曾经是一个“旧”示例。有一个新的通用方法,您可以在其中传递自定义插件上下文,您可以在其中注入许多属性,包括输出参数(在此处查找GetDefaultPluginContext)。
但总的来说,回到你原来的问题,如果你有很多这样的步骤:
可以有很多方法来对这些东西进行单元测试,但我个人的建议是,这些步骤太多,无法包含在单个单元测试中。我宁愿重构该逻辑,以便可以更轻松地单独对其进行单元测试。
我将把它恢复为仅 3 个步骤,以使其更简单:
我首先会重构该代码,以便我可以更轻松地小块地测试它。这样做可以使测试更易于实施、理解和审查。
我会为每个(至少!)创建 3 个不同的单元测试:
希望这有帮助(现在:P)!
| 归档时间: |
|
| 查看次数: |
1498 次 |
| 最近记录: |