簡體   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