我尝试使用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))
答案 0 :(得分:0)
不确定您要完成的任务。如果目标是拥有一个构建器,它具有所需的所有模拟的句柄,那么为什么不只是返回模拟本身,并将其配置为通常会做的:
builder.GetMock<IOrganizationService>().Setup....
这会阻止您在同一个构建器上进行链接(我认为您正在尝试这样做),但这不是一个很大的权衡,并且会简化您的设置。