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 构造函数并且是密封的?
最后我通过反射调用 LinkDescriptor
class 的非 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
的状态
我有一个 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 构造函数并且是密封的?
最后我通过反射调用 LinkDescriptor
class 的非 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 的状态