【问题标题】:Verifying a non-virtual method in base class is called using Moq使用 Moq 调用验证基类中的非虚拟方法
【发布时间】:2014-05-15 17:26:10
【问题描述】:

这篇文章要求基类方法是虚拟的:question link

这对我不起作用,因为基类方法不是虚拟的(我没有编写它并且没有源代码)。

如果基类方法不是虚拟的,我如何模拟并验证它们是否被调用?

最后一个标准 - 我在 Mac 上使用 Xamarin Studio 进行开发。 Moq 工作正常,但 TypeMock 或 JustMock(Windows 安装程序)等其他框架将无法工作。

【问题讨论】:

  • @StuartLC 已删除。粘贴错误。
  • @JuanLopes 感谢您的链接,但由于我在 Mac 上使用 Xamarin Studio,我不相信这些产品会起作用。

标签: c# unit-testing mocking xamarin moq


【解决方案1】:

这是不可能的。由于 Moq 的工作方式,Moq 不可能模拟非虚拟方法。

你是在直接模拟类类型YourClass,其中YourClass 派生自BaseClass,而BaseClass 有这个(public?)你感兴趣的非虚拟非静态方法?所以你的模拟的类型是Mock<YourClass>,而不是Mock<IYourClass>IYourClass 是一个接口?

您是否绝对有必要使用BaseClass 作为基类,而不是“组合”(在您的类内部有一个BaseClass 类型的字段)?

【讨论】:

    【解决方案2】:

    如上所述,Moq 只能模拟虚拟方法。
    一种可能的最终结果是将您的 un-moqable 类包装在代理中并在您的代码中使用此代理。

    public class MyUnMoqableClass {
        public string GetValue() {
            return "Hello World";
        }
    }
    
    public interface IMyUnMoqableClassProxy {
        string GetValue();
    }
    
    public class UnMoqableClassProxy : IMyUnMoqableClassProxy {
    
        private readonly MyUnMoqableClass _myUnMoqableClass;
    
        public UnMoqableClassProxy(MyUnMoqableClass myUnMoqableClass) {
            _myUnMoqableClass = myUnMoqableClass;
        }
    
        public string GetValue() {
            return _myUnMoqableClass.GetValue();
        }
    
    }
    

    如果您在 unmoqable 类上有一个很大的接口,但确实让我们隔离了客户端代码,这可能会有点(很多)乏味。

    【讨论】:

    • 是的,这就是我最终要做的 - 我必须隔离起订量不可模拟的类。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多