c# WCF 测试 EntityDescriptor

c# WCF Testing EntityDescriptor

我有一个 WCF 客户端,我在其中通过 OData 获取数据。我想对我的客户端进行单元测试,并且已经为 DataServiceContext 创建了一个接口:

internal interface ODataServiceContext
{

    DataServiceResponse SaveChanges(SaveChangesOptions options);

    ReadOnlyCollection<LinkDescriptor> Links { get; }

    ...

}

对于我目前的测试,我需要伪造 Links 属性。我需要 return 至少一个 LinkDescriptor。有人知道如何实现吗?

现在我使用 NSubstitute 伪造接口:

var context = Substitute.For<ODataServiceContext>();
var list = new List<LinkDescriptor>();
var links = new ReadOnlyCollection<LinkDescriptor>(list);
context.Links.Returns(links);

这适用于针对空 Links属性 进行测试。但是我怎样才能将 link 描述符添加到集合中,因为 class LinkDescriptor 没有 public 构造函数并且是密封的?

最后我通过反射调用 LinkDescriptorclass 的非 public 构造函数做到了:

var constructors = typeof(LinkDescriptor).GetConstructors(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var descriptor = constructors[1].Invoke(new object[] { null, propertyName, null, entityState }) as LinkDescriptor;

看来,构造函数的四个参数是:

  • 对象来源:来源实体
  • string sourceProperty:源实体上的导航属性
  • 对象目标:目标实体
  • EntityStates 状态:link
  • 的状态