我有一个普通的单元测试,并尝试在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<IAddTagAction>();
行上我得到以下异常:
Die Initialisierungsmethode'Argus.Avenue.DataService.Test.Regeln.ActionFactoryTest.Setup'hat eineAusnahmeausgelö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“没有实现。
这是界面&amp;涉及的课程:
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;
}
}
BaseAction:
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);
}
提前致谢
修改:如果我删除了“GetWertbezeichnung”方法,那么假创作就可以了......它必须与这些方法有关...
Edit2:我们使用的版本是:
.NET Framework 4.6.2
x64
4.1.1
MSTest.TestAdapter 1.2.0
MSTest.TestFramework 1.2.0
答案 0 :(得分:3)
由于known bug,这是FakeItEasy 4.1.1中的a bug in Castle.Core。它已在FakeItEasy 4.2.0中修复。只需升级到更新的版本就可以了。