我有一个普通的单元测试,并尝试在设置方法中创建一个接口的假象:
[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