环境: VS2017,针对 .NET Core 2.1 的 C# 7.0。
我正在尝试编写一个用于单元测试的假/模拟类,并且我在访问DisplayClass
对象上的属性时遇到了困难,我知道这是来自匿名函数的闭包类。
我的代码如下所示:
namespace MyCompany.Application.Web.Test.Fakes
{
public class FakeElasticClient : IElasticClient
{
public FakeElasticClient() { }
public Task<ISearchResponse<T>> SearchAsync<T>(Func<SearchDescriptor<T>, ISearchRequest> selector = null, CancellationToken cancellationToken = default(CancellationToken)) where T : class
{
var methodName = selector.Method.Name;
dynamic tgt = selector.Target;
object id = tgt?.GetType().GetProperty("id")?.GetValue(tgt, null);
int? total;
if (methodName.Contains("Quux"))
{
total = CountSomething((Guid)id);
}
else
{
total = CountSomethingElse((Guid)id);
}
return Task.Run(() => new FakeSearchResponse<T>(total ?? 0) as ISearchResponse<T>);
}
// … below here follows a couple thousand other methods
即使 Visual Studio 调试器显示该对象具有一个属性,强制转换id为也会Guid抛出一个:NullReferenceExceptiontgtid
注释:
我从这个答案object id = …
中偷了线。
tgt.GetType()
返回MyCompany.Application.Domain.Repository.Implementations.BusinessEntityRepository.<>c__DisplayClass8_0
tgt.GetType().GetProperties()
返回一个空PropertyInfo
数组。
受这篇博文的启发,我为 the和class添加了一个[assembly: InternalsVisibleTo("MyCompany.Application.Web.Test")]
属性,据我所知,这是调用链中唯一涉及的两个类。没有任何区别。MyCompany.Application.Domain.Repository.Implementations.BusinessEntityRepository
MyCompany.Application.Web.Controllers
我尝试IgnoresAccessChecksTo
按照此处描述的方法进行操作,但无法编译任何内容。
如何检索 的值id
?
德玛西亚99
相关分类