【问题标题】:Unity can't resolve a dynamically mocked classUnity 无法解析动态模拟的类
【发布时间】:2012-09-10 10:35:36
【问题描述】:

设置

  • 解决方案使用棱镜
  • VB 编写的模块项目
  • 用 C# 编写的测试项目

在我的单元测试中,我模拟了模块使用的服务并传递它们,但是当模块尝试解析时,它会失败并出现以下异常

    {"Resolution of the dependency failed, type = "UnderwritingWorkflow.Common.Services.IValidationService", name = "(none)".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, UnderwritingWorkflow.Common.Services.IValidationService, is an interface and cannot be constructed. Are you missing a type mapping?

发生异常时,容器为:

正在解决 UnderwritingWorkflow.Common.Services.IValidationService,(无) "}

这里是使用 UnityContainer 注册对象的代码:

var validationService = new Mock<IValidationService>(MockBehavior.Strict);

validationService.Setup(x => x.Validate(Moq.It.IsAny<object>()))
                 .Returns(() => new ValidationResults());

Container.RegisterInstance(validationService.Object);

另外,如果尝试在注册后直接从 c# 解析 IServiceValidation(从构造函数中)似乎可以工作:

Container.Resolve<IValidationService>();

任何想法为什么会发生这种情况?

注意:我使用的是 Moq 模拟框架,它在运行时创建类,我想知道是不是 VB 的限制不允许我使用它?

【问题讨论】:

  • 只是为了理解你的问题:模块是调用Resolve还是注入IValidationService作为构造函数参数?
  • 我确实调用了resolve。并且从 c# 调用 resolve 有效,但从 VB 则不行
  • 也许您有两个不同的容器,其中一个在您的测试中设置,但您的生产代码使用不同的容器。
  • 不,这是我检查的第一件事
  • 也许你的初始化代码相对于你的模块代码的运行顺序从 C# 到 VB 不同?顺便说一句:Abusing the container as a ServiceLocator should be avoided if possible.

标签: c# vb.net prism unity-container


【解决方案1】:

我找到了导致这个问题的原因,这是 Moq 框架的限制。 Aparently Moq 不能模拟静态方法,包括扩展方法和 Container.Resolve 是扩展方法,因此它失败了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 2013-06-28
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多