5
public class Business {  
    protected List<BusinessRulesDto> BusinessRules { get; set; }  
}

私は試した:

  1. businessMockObject.Protected().SetupSet<List<BusinessRulesDto>>("BusinessRules", ItExpr.IsAny<List<BusinessRulesDto>>()).Verifiable();
    
  2. var businessRulesDtoList = Builder<BusinessRulesDto>.CreateListOfSize(2).Build().ToList();  
    businessMockObject.Protected().SetupGet<List<BusinessRulesDto>>("BusinessRules").Returns(businessRulesDtoList);
    businessMockObject.Protected().SetupSet<List<BusinessRulesDto>>("BusinessRules", ItExpr.IsAny<List<BusinessRulesDto>>()).Verifiable();
    

私は多くのことを試しましたが、どれもうまくいきませんでした。保護されたメソッドをモックできますが、保護されたプロパティはモックできません。

保護されたプロパティをモックするにはどうすればよいですか?

4

2 に答える 2

3

ドキュメントによると

Moq 4.8 以降では、同じメンバーを持ち、IntelliSense が機能するために必要な型情報を提供する、まったく無関係な型を介して保護されたメンバーを設定できます。このインターフェイスを使用して、保護されたジェネリック メソッドと、参照パラメーターを持つメソッドをセットアップすることもできます。

テスト プロジェクトにインターフェイスを作成して、モックする保護されたメンバーをカプセル化します。

public interface IBusinessProtectedMembers {  
    List<BusinessRulesDto> BusinessRules { get; set; }  
}

次に、それをモックで使用して、IntelliSense も利用します

var businessRulesDtoList = Builder<BusinessRulesDto>.CreateListOfSize(2).Build().ToList();
businessMockObject.Protected().As<IBusinessProtectedMembers>()
    .Setup(_ => _.BusinessRules)
    .Returns(businessRulesDtoList);

最後に、これはすべて、フレームワークがメンバーをオーバーライドできるように、モック/スタブ化されるメンバーが仮想でなければならないという Moq の要件に左右されます。

つまり、次Businessのようになります

public class Business {  
    protected virtual List<BusinessRulesDto> BusinessRules { get; set; }  
}

上記の提案が機能するために。

于 2018-03-28T10:55:02.797 に答える