繁体   English   中英

如何在派生类中模拟基本方法?

[英]How to mock a base method in a derived class?

我想模拟方法base.Generate(operation, model, builder, false); 以下代码:

public class ExtendedSqlServerMigrationsSqlGenerator : SqlServerMigrationsSqlGenerator
    {
        public ExtendedSqlServerMigrationsSqlGenerator(MigrationsSqlGeneratorDependencies dependencies, IMigrationsAnnotationProvider migrationsAnnotations) :base(dependencies, migrationsAnnotations){}

        // this methode should be tested 
        protected override void Generate(CreateIndexOperation operation, IModel model, MigrationCommandListBuilder builder, bool terminate)
        {
            base.Generate(operation, model, builder, false); // this line should be mocked
            AddIncludeIndex(operation, builder, terminate);
        }
        protected void AddIncludeIndex(CreateIndexOperation operation, MigrationCommandListBuilder builder, bool terminate)
        {
            //some code
        }
        public void GenerateTest(CreateIndexOperation operation, IModel model, MigrationCommandListBuilder builder, bool terminate)
        {
            Generate(operation, model, builder, terminate);
        }

我使用的模拟设置是:

var sut = new Mock<ExtendedSqlServerMigrationsSqlGenerator>(GetDependencies(), p2.Object) 
{ 
 CallBase = true 
};
sut.Protected().Setup("Generate", true, ItExpr.IsAny<CreateIndexOperation>(), ItExpr.IsAny<IModel>(), ItExpr.IsAny<MigrationCommandListBuilder>(), ItExpr.IsAny<bool>());
sut.Object.GenerateTest(createIndexOperation.Object, new Model(), m3.Object, false);

目前,我调用了GenerateTest() 问题在于Generated方法是base.Generate而不是基础方法base.Generate我还尝试设置派生的TestClass,这使我可以从base.Generate调用受保护的方法。 但是有同样的问题。

这与无反射地模拟受保护的成员不同 我知道如何模拟对基类方法的调用,但不知道如何模拟相同的方法。

有关该课程的一些背景信息

EF可以基于模型生成SQL语句。 为了扩展生成的SQL,我用派生类替换了DI中的此类。 当EF调用generate ,我必须调用基类,然后添加一些额外的SQL语句。

我要模拟`base.generate'的原因是

  • 配置有效参数并不容易
  • 我对基类的实现细节不感兴趣。

这种情况似乎不是唯一的,并且期望有一种简单的方法可以对此进行模拟。

虽然我认为您要解决的问题在广义上可以非常有效,尤其是当基类发出您要避免的系统/ IO调用时,我还是会指出前一个相关问题中的回答以建议:最小起订量不是此处的正确工具。

Moq旨在从sut删除依赖项,而不是从其替换功能。 这是有道理的,因为sut中的函数经常会有副作用(尤其是当您要替换的函数的返回类型为void时)。

从历史上看,当我使用EF进行这种性质的测试时,我发现为每个测试类(或测试程序集)启动一个localDb并执行集成测试而不是为了进行单元测试而尝试进行单元测试更加方便和可靠。 。 当然,这里有一些依赖关系,您在迁移中使用代码优先。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM