代码之家  ›  专栏  ›  技术社区  ›  xeraphim

Fakeitiasy异常方法没有实现

  •  0
  • xeraphim  · 技术社区  · 6 年前

    我有一个普通的单元测试,并尝试在设置方法中创建一个接口的假象:

    [TestInitialize]
        public void Setup()
        {
            var unityContainer = A.Fake<IUnityContainer>();
    
            var addTagAction = A.Fake<IAddTagAction>();
    
            A.CallTo(() => unityContainer.Resolve(typeof(IAddTagAction), null, A<ResolverOverride[]>._)).Returns(addTagAction);
    
            this.testee = new ActionFactory(unityContainer);
        }
    

    不幸的是,在电话里 var addTagAction = A.Fake<IAddTagAction>(); 我得到以下例外:

    die initialisierungsmethode'argus.avenue.dataservice.test.regeln.actionFactoryTest.setup'hat eine ausnahme ausgel_¶st.fakeitiasy.core.fakecreationexception: 未能创建argus.avenue.data.dataservice.regeln.actions.iaddtagaction类型的伪。

    以下是每个尝试的构造函数失败的原因列表: 没有构造函数参数失败: 在类型argus.avenue.data.dataservice.regeln.actions.iaddtagaction上找不到可用的默认构造函数。 在此调用期间捕获了System.TypeLoadException类型的异常。它的信息是: die method“getwertbezeichung”im typ“castle.proxys.objectProxy_1“der assembly”dynamicPoxygenassembly2,version=0.0.0,culture=neutral,publicKeytoken=null”hat keine implementierung。

    翻译: 程序集“dynamicProxygenAssembly2,version=0.0.0.0,culture=neutral,publicKeyToken=null”的“castle.proxies.objectProxy_1”类型中的“getwertbezeichung”方法没有实现。

    以下是涉及的接口类和类:

    IADDTAG操作:

    public interface IAddTagAction : IBaseAction
    {
    }
    

    IBASeaction(I分区):

    public interface IBaseAction
    {
        void Execute(IList<long> artikelIds, int? id, RegelModel regelModel);
        string GetWertbezeichnung(int? wert);
        string GetWertbezeichnung(IList<int> werte);
    }
    

    添加标记操作:

    public class AddTagAction : BaseAction, IAddTagAction
    {
        public AddTagAction(
            IEfContextFactory efContextFactory, 
            IRepositoryFactory repositoryFactory, 
            IDateTimeProvider dateTimeProvider)
            : base(efContextFactory, repositoryFactory, dateTimeProvider)
        {
        }
    
        public override void Execute(IList<long> artikelIds, int? tagId, RegelModel regelModel)
        {
            // ...
        }
    
        /// <inheritdoc />
        public override string GetWertbezeichnung(IList<int> werte)
        {
            using (var context = this.EfContextFactory.Create(RequestInfo))
            {
                var tagRepository = this.RepositoryFactory.Create<ITagRepository>(context, RequestInfo);
                var tags = tagRepository.GetTagNames(werte.ToList()).FirstOrDefault();
                return tags.Value;
            }
        }
    

    基本动作:

    public abstract class BaseAction : IBaseAction
    {
        protected BaseAction(IEfContextFactory efContextFactory, IRepositoryFactory repositoryFactory, IDateTimeProvider dateTimeProvider)
        {
            this.EfContextFactory = efContextFactory;
            this.RepositoryFactory = repositoryFactory;
            this.DateTimeProvider = dateTimeProvider;
        }
    
        protected IRepositoryFactory RepositoryFactory { get; }
    
        protected IEfContextFactory EfContextFactory { get; }
    
        protected IDateTimeProvider DateTimeProvider { get; }
    
        public virtual void Execute(IList<long> artikelIds, int? id, RegelModel regelModel)
        {
            // ...
        }
    
        public string GetWertbezeichnung(int? wert)
        {
            if (!wert.HasValue) {
                return string.Empty;
            }
            var werte = new List<int> { wert.Value };
            return GetWertbezeichnung(werte);
        }
    
        public abstract string GetWertbezeichnung(IList<int> werte);
    }
    
    • 为什么在创建假冒的IAddTagAction接口时会收到此异常?

    提前谢谢

    编辑: 如果我删除“getwertbezeichung”方法,那么伪造的创建就有效了。它一定与这些方法有关…

    编辑2: 我们使用的版本是:

    • 目标框架: .NET Framework 4.6.2
    • 平台目标: x64
    • 传真: 4.1.1
    • MSTest.TestAdapter 1.2.0
    • MSTest.TestFramework 1.2.0
    1 回复  |  直到 6 年前
        1
  •  3
  •   Thomas Levesque    6 年前

    这是一个 known bug 在Fakeitisy 4.1.1中,由于 a bug in Castle.Core .它固定在Fakeitiasy 4.2.0中。升级到新版本就可以了。