这个问题很简单。我已经开发了一个IDocumentClient (它是DocumentDB .NET客户机)。我是Moq‘’ing ExecuteStoredProcedureAsync()方法。它返回一个StoredProcedureResponse类型(一个具体的类型),但是它的接口非常锁定。
我想我可以创建一个StoredProcedureResponse并将我的有效负载嵌入到Response属性中,但是它的setter是私有的。此外,唯一的构造函数是无参数的。
我在这里错过了什么?如果方法返回一个接口类型(IStoredProcedureResponse)是理想的,但我无法控制它。我意识到我可以为IDocumentClient编写一个包装器,但这是不可行的。
我唯一能想到的就是用"new“关键字扩展和强制覆盖属性--但是,在实际的调用代码中,我会遇到一个可怕的问题,我会检查运行时类型和向下转换,以便使用重写资源属性。
发布于 2017-01-20 22:41:54
在您的顶层需要IDocumentClient接口吗?如果没有,您可以创建一个服务接口:
public interface IDocumentService
{
Task<IStoredProcedureResponse<T>> ExecuteStoredProcedureAsync<T>(string query, IEnumerable<object> parameters);
}在这种情况下,或者类似的情况下,您可以实现使用DocumentClient的活动服务和只返回模拟IStoredProcedureResponse的模拟服务。
顺便说一句,我觉得奇怪的是,IDocumentClient.ExecuteStoredProcedureAsync返回的具体实例也恰好是从接口继承的。
发布于 2018-02-02 09:33:02
通过阅读评论,我找到了一个简单的解决方案:
var response = new StoredProcedureResponse<T>();
response.GetType().InvokeMember("responseBody",
BindingFlags.Instance | BindingFlags.SetField | BindingFlags.NonPublic, Type.DefaultBinder, response, new object[] {new T()});发布于 2017-01-20 22:59:57
使用反射创建它:
Type type=typeof(StoredProcedureResponse);
var spr = (StoredProcedureResponse)Activator.CreateInstance(type,true);并设置属性和其他需要使用反射的内容:
spr.GetType().InvokeMember("PropertyName",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
Type.DefaultBinder, obj, "MyName");https://stackoverflow.com/questions/41773312
复制相似问题