FakeItEasy 异常方法没有实现



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

[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.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);
}

添加标记操作:

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"方法,假创建工作......它一定与这些方法有关......

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

  • 目标框架:.NET Framework 4.6.2
  • 平台目标:x64
  • 假的简单:4.1.1
  • MSTest.TestAdapter 1.2.0
  • MSTest.TestFramework 1.2.0

这是FakeItEasy 4.1.1中的一个已知错误,由于Castle.Core中的一个错误。它在FakeItEasy 4.2.0中得到了修复。只需升级到较新的版本,您应该没问题。

最新更新