【发布时间】:2015-05-17 19:47:48
【问题描述】:
我有这种情况:使用外部 DLL 并进行 API 调用的天蓝色云服务。这个 DLL 有一个抽象类,它有一个静态方法来返回我需要用来进行 API 调用的子类引用。
现在出于测试目的,我们在模拟器中运行云服务并运行我们的单元测试。但是我们不想对外部系统进行 API 调用。我们需要以某种方式拦截它。我昨天大部分时间都在尝试看看我是否可以做一些依赖注入(统一)来做到这一点,但不用说,没有运气。
抽象类公开静态方法以获取子类的实例以实际进行 API 调用可能是最具限制性的场景。
下面是一些反编译和清理的代码,以显示相关部分。
public abstract class EntityManager : System.Object
{
private static object lockObject;
private static Dictionary<System.Type, EntityManager> entityManagers;
private bool isSingleton;
public enum EntityManagerInstanceType : int
{
SingletonInstance = 0,
NewInstance = 1,
}
static EntityManager() { }
protected EntityManager() { }
public static T GetEntityManager<T>(EntityManagerInstanceType instanceType) where T : EntityManager
{
T item;
System.Type type = typeof(T);
T t = default(T);
lock (EntityManager.lockObject)
{
if (instanceType != EntityManagerInstanceType.SingletonInstance || !EntityManager.entityManagers.ContainsKey(type))
{
t = (T)System.Activator.CreateInstance(type, true);
try
{
t.isSingleton = instanceType == EntityManagerInstanceType.SingletonInstance;
}
catch (Exception adapterException)
{
throw;
}
if (instanceType == EntityManagerInstanceType.SingletonInstance)
{
EntityManager.entityManagers[type] = t;
}
return t;
}
else
{
item = (T)EntityManager.entityManagers[type];
}
}
return item;
}
protected object ProcessRequest(string methodName, object request) { return new object(); }
}
public class PersonaEntityManager : EntityManager
{
protected PersonaEntityManager() { }
public PersonaResponseData UpdatePersona(PersonaUpdateRequestData requestData)
{
return (PersonaResponseData)base.ProcessRequest("Mdm.UpdatePersona", requestData);
}
}
public class PublisherWorkerRole : RoleEntryPoint
{
public bool UpdatePersona(PersonaUpdateRequestData contact, string MessageId)
{
PersonaEntityManager mgr = EntityManager.GetEntityManager<PersonaEntityManager>(EntityManager.EntityManagerInstanceType.NewInstance);
var resp = mgr.UpdatePersona(contact);
return resp != null;
}
}
在这种情况下,理想的方法是什么?如果不设置我们自己的模拟 API 并更改应用程序配置以进行测试以调用我们的模拟 API,这甚至可以测试吗?
如果您需要我进一步详细说明,请告诉我。
【问题讨论】:
标签: c# unit-testing dependency-injection inversion-of-control