【问题标题】:FakeItEasy exception method does not have an implementationFakeItEasy 异常方法没有实现
【发布时间】:2018-06-18 07:47:49
【问题描述】:

我有一个普通的单元测试,并尝试在 setup-method 中创建一个假的接口:

[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&lt;IAddTagAction&gt;(); 行我得到以下异常:

Die Initialisierungsmethode 'Argus.Avenue.DataService.Test.Regeln.ActionFactoryTest.Setup' hat eine Ausnahme ausgelöst。 FakeItEasy.Core.FakeCreationException: 无法创建 Argus.Avenue.Data.DataService.Regeln.Actions.IAddTagAction 类型的假。

以下是每个尝试的构造函数失败的原因列表: 没有构造函数参数失败: 在 Argus.Avenue.Data.DataService.Regeln.Actions.IAddTagAction 类型上找不到可用的默认构造函数。 在此调用期间捕获了 System.TypeLoadException 类型的异常。它的信息是: Die Methode "GetWertbezeichnung" im Typ "Castle.Proxies.ObjectProxy_1" der Assembly "DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" hat keine Implementierung。

翻译: “程序集“DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”的类型“Castle.Proxies.ObjectProxy_1”中的方法“GetWertbezeichnung”没有实现。

以下是涉及的接口和类:

IAddTagAction:

public interface IAddTagAction : IBaseAction
{
}

IBaseAction:

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

AddTagAction:

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 接口时会出现此异常?

提前致谢

编辑:如果我删除“GetWertbezeichnung”-方法,虚假创建工作..它一定与这些方法有关......

Edit2:我们使用的版本是:

  • 目标框架:.NET Framework 4.6.2
  • 平台目标:x64
  • FakeItEasy:4.1.1
  • MSTest.TestAdapter 1.2.0
  • MSTest.TestFramework 1.2.0

【问题讨论】:

  • 这很奇怪...我无法重现该问题。您使用的是哪个版本的 FakeItEasy?你的目标框架是什么?
  • 对吗?我也不明白... 目标框架是.NET Framework 4.6.2 平台目标是x64 FakeItEasy 版本是4.1.1
  • 另外我们使用MSTest.TestAdapter 1.2.0MSTest.TestFramework 1.2.0

标签: c# .net unit-testing mocking fakeiteasy


【解决方案1】:

由于a bug in Castle.Core,它是 FakeItEasy 4.1.1 中的 known bug。它已在 FakeItEasy 4.2.0 中修复。只需升级到新版本就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多