如何通过构建器配置Moq

时间:2015-06-26 07:30:27

标签: c# dynamics-crm moq

我尝试使用Moq和构建器模式来设置用于测试CRM插件的服务。在构建器上,我有ConfigureMock<T>(Expression<Action<Mock<T>>>)来注入单个配置。我的问题是,一旦服务.Setup(),我希望通过.Callback<Entity>()获得服务所使用的实体,但我无法在测试中将其分配给本地变量,因为我可以&#39 ; t在回调表达式中进行赋值。

这是配置:

private readonly Dictionary<Type, object> MockServices = new Dictionary<Type, object>();

public PluginContextBuilder ConfigMock<T>(Expression<Action<Mock<T>>> setupConfig) where T : class
{
    object svc = null;
    if (MockServices.TryGetValue(typeof(T), out svc))
    {
        var mockSvc = (Mock<T>) svc;
        Action<Mock<T>> setup = setupConfig.Compile();
        setup(mockSvc);
    }

    return this;
}

以下是我想在测试中配置(但不会编译)的示例:

var createdFanClub = null;
var context = new PluginContextBuilder()
                .ConfigMock<IOrganizationService>(c => 
                    c.Setup(s => 
                            s.Create(It.IsAny<Entity>()))
                            .Returns(fanclubGuid))
                            .Callback<Entity>(a => createdFanClub = a))

如果我创建了一个额外的Action<Entity>来完成作业,那么它可行,但我认为它不实用,如果我有多个实体,我需要做的就是他们的许多任务:

Entity createdFanClub = null;
Action<Entity> assign = a => createdFanClub = a;
var context = new PluginContextBuilder()
                .ConfigMock<IOrganizationService>(c => 
                    c.Setup(s => 
                            s.Create(It.IsAny<Entity>()))
                            .Returns(fanclubGuid))
                            .Callback<Entity>(assign))

1 个答案:

答案 0 :(得分:0)

不确定您要完成的任务。如果目标是拥有一个构建器,它具有所需的所有模拟的句柄,那么为什么不只是返回模拟本身,并将其配置为通常会做的:

builder.GetMock<IOrganizationService>().Setup....

这会阻止您在同一个构建器上进行链接(我认为您正在尝试这样做),但这不是一个很大的权衡,并且会简化您的设置。